####

Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.

Motivation


Yanosky, J. D. et al. Spatio-temporal modeling of particulate air pollution in the conterminous United States using geographic and meteorological predictors. Environ Health 13, 63 (2014). - Article in Frontiers of Pharmacology

Main Questions


Our main question:

  1. How has tobacco/nicotine use by American youth changed since 2015?
  2. How do vaping rates compare between males and females?
  3. What vaping brands and flavors appear to be used the most frequently?
    • During the past 30 days, what brand of e-cigarettes did you usually use?
  4. Have vaping rates possibly influenced tobacco/nicotine use?

Learning Objectives


In this case study, we will cover how to make a variety of visualizations to compare multiple groups across time. We will also demonstrate how to work with codebooks. We will cover the concept of survey weighting and introduce the srvyr package. We will discuss the difference between pooled cross-sectional data and panel data. We will especially focus on using packages and functions from the Tidyverse for wrangling data, such as dpyr and for visualization, suchas as ggplot2. The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R especially efficient.


We will begin by loading the packages that we will need:

Session info

R version 4.0.1 (2020-06-06)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Mojave 10.14.5

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] cowplot_1.0.0 purrr_0.3.4   forcats_0.5.0 ggplot2_3.3.1 srvyr_0.3.10 
 [6] readr_1.3.1   readxl_1.3.1  stringr_1.4.0 tidyr_1.1.0   dplyr_1.0.0  
[11] knitr_1.28    here_0.1     

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.4.6     pillar_1.4.4     compiler_4.0.1   cellranger_1.1.0
 [5] base64enc_0.1-3  tools_4.0.1      digest_0.6.25    gtable_0.3.0    
 [9] evaluate_0.14    lifecycle_0.2.0  tibble_3.0.1     lattice_0.20-41 
[13] pkgconfig_2.0.3  rlang_0.4.6      Matrix_1.2-18    DBI_1.1.0       
[17] yaml_2.2.1       xfun_0.14        withr_2.2.0      generics_0.0.2  
[21] vctrs_0.3.0      mitools_2.4      hms_0.5.3        rprojroot_1.3-2 
[25] grid_4.0.1       tidyselect_1.1.0 glue_1.4.1       R6_2.4.1        
[29] survival_3.1-12  rmarkdown_2.2    magrittr_1.5     scales_1.1.1    
[33] backports_1.1.7  ellipsis_0.3.1   htmltools_0.4.0  splines_4.0.1   
[37] colorspace_1.4-1 stringi_1.4.6    survey_4.0       munsell_0.5.0   
[41] crayon_1.3.4    

Data wrangling

$psu
015438 058470 058688 073025 074170 086754 086998 087425 087656 087664 087896 
   313    325    221    232    314    347     93    336    397    470    437 
087997 172374 172421 172817 172932 173042 173872 174438 215184 243985 244289 
   192    331    285    205     67    132    119    165    143    253    278 
245271 245626 246502 259811 273721 302895 315630 343489 343499 344194 357949 
   345     36    110    211    254    223    116    259    156    348    251 
358133 372861 373688 374028 374781 401600 401625 443836 457980 486439 486537 
   209    401    221    435    299    292    221    304    136    100     68 
486665 487290 515976 515979 516124 516428 516479 516582 530234 530465 559544 
   320    204    169    219    230    130    166    280    249    279    234 
559658 560204 572278 573191 586938 600437 602251 602538 657580 659775 673264 
   134     58    261     41    101     18     28    216    233    179    295 
674219 674776 688472 689762 690405 692299 693273 700933 730119 730385 759375 
   170    194     96    137     49     65    176    231    275    313    205 
772232 772340 787476 787705 789039 
   286    247    240    184    149 

$finwgt
6084.762382383 6084.749363267 6084.748763328  393.890426751  641.647375466 
            90             61             50             48             48 
1462.436434424  593.037596627  895.030720016  342.509547149  934.989137039 
            47             45             44             37             37 
  702.57430816  645.096986799 6084.747889789  577.454052555   651.46204257 
            36             35             34             33             33 
 929.843069043  452.180288822  541.333365673  729.816382606  835.705455892 
            33             32             32             32             32 
 888.382540193   927.94099198  851.768379729  868.130099018  894.645660874 
            32             32             31             31             31 
 984.845596021  701.063606043  793.263666402   543.10044387  946.819967478 
            31             30             30             29             29 
1015.462088582 1016.149108108 1019.981866234 1040.468408082 1141.362079889 
            29             29             29             29             29 
1291.939451853 1329.790103112   182.06558616  743.973459478  794.640565906 
            29             29             28             28             28 
 898.543444732 1042.833088444 1131.481775528  1373.56145484   366.87804128 
            28             28             28             28             27 
 392.039206468  547.833907307  579.457069112  593.219832127  854.809873284 
            27             27             27             27             27 
 1048.47425302 1104.835457789 1159.516870486 1816.798230284 6054.100327083 
            27             27             27             27             27 
  606.95980431  818.085712533 1146.426800539  706.423256175  775.729833268 
            26             26             26             25             25 
 946.112967867  996.981564624 1025.880196581 1063.502080912 1119.667616736 
            25             25             25             25             25 
  1294.1057904 1315.317079036   6084.7477331  402.063366229  548.721336409 
            25             25             25             24             24 
 636.856583371  679.644603411  715.319618737  785.483271485  812.008313568 
            24             24             24             24             24 
 886.558267168  892.891330328  910.523814983 1034.181535833 1078.657221151 
            24             24             24             24             24 
1342.832937151 1746.901437456  424.255231699  572.255680335  772.304638451 
            24             24             23             23             23 
 815.808021393  916.165629612 1166.771298082 1225.819285873 1322.399990435 
            23             23             23             23             23 
 1374.74354602 1673.993155958 1750.253995437 6036.818568997    660.0342283 
            23             23             23             23             22 
  695.66010798  705.225188396  760.691396806  793.377847684        (Other) 
            22             22             22             22          14820 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
1907 1305  918  391 1738  616  578  144 2821  402  446  233 1875 1954  799 1584 

$Age
   9   10   11   12   13   14   15   16   17   18   19 NA's 
  23    5  930 2454 2832 2735 2535 2440 2302 1251  135   69 

$female
   1    2 NA's 
8958 8622  131 

$Grade
   6    7    8    9   10   11   12   13 NA's 
2552 2845 2773 2512 2509 2282 2130   18   90 

$Not_HL
    1  NA's 
12311  5400 

$HL_Mex
    1  NA's 
 2736 14975 

$HL_PR
    1  NA's 
  536 17175 

$HL_Cub
    1  NA's 
  261 17450 

$HL_Other
    1  NA's 
 1638 16073 

$Race_AIAN
    1  NA's 
 1152 16559 

$Race_Asian
    1  NA's 
 1023 16688 

$Race_BAA
    1  NA's 
 3600 14111 

$Race_NHOPI
    1  NA's 
  493 17218 

$Race_White
    1  NA's 
10853  6858 

$ECIGT
    1     2  NA's 
 3713 13681   317 

$ECIGAR
    1     2  NA's 
 2918 14379   414 

$ESLT
    1     2  NA's 
 1360 15993   358 

$EELCIGT
    1     2  NA's 
 4673 12727   311 

$EROLLCIGTS
    1     2  NA's 
  862 16134   715 

$EBIDIS
    1     2  NA's 
  245 16751   715 

$EHOOKAH
    1     2  NA's 
 2244 14752   715 

$EPIPE
    1     2  NA's 
  408 16588   715 

$ESNUS
    1     2  NA's 
  394 16602   715 

$EDISSOLV
    1     2  NA's 
  133 16863   715 

$CCIGT
    1     2  NA's 
 1081 16266   364 

$CCIGAR
    1     2  NA's 
 1006 16162   543 

$CSLT
    1     2  NA's 
  606 16777   328 

$CELCIGT
    1     2  NA's 
 1956 15485   270 

$CROLLCIGTS
    1     2  NA's 
  368 16576   767 

$CBIDIS
    1     2  NA's 
   90 16854   767 

$CHOOKAH
    1     2  NA's 
  860 16084   767 

$CPIPE
    1     2  NA's 
  137 16807   767 

$CSNUS
    1     2  NA's 
  148 16796   767 

$CDISSOLV
    1     2  NA's 
   54 16890   767 

$brand_ecig
 NA's 
17711 

$menthol
 NA's 
17711 

$clove_spice
 NA's 
17711 

$fruit
 NA's 
17711 

$chocolate
 NA's 
17711 

$alcoholic_drink
 NA's 
17711 

$candy_dessert_sweets
 NA's 
17711 

$other
 NA's 
17711 

$no_use
 NA's 
17711 
$psu
015438 058470 058688 073025 074170 086754 086998 087425 087656 087664 087896 
   313    325    221    232    314    347     93    336    397    470    437 
087997 172374 172421 172817 172932 173042 173872 174438 215184 243985 244289 
   192    331    285    205     67    132    119    165    143    253    278 
245271 245626 246502 259811 273721 302895 315630 343489 343499 344194 357949 
   345     36    110    211    254    223    116    259    156    348    251 
358133 372861 373688 374028 374781 401600 401625 443836 457980 486439 486537 
   209    401    221    435    299    292    221    304    136    100     68 
486665 487290 515976 515979 516124 516428 516479 516582 530234 530465 559544 
   320    204    169    219    230    130    166    280    249    279    234 
559658 560204 572278 573191 586938 600437 602251 602538 657580 659775 673264 
   134     58    261     41    101     18     28    216    233    179    295 
674219 674776 688472 689762 690405 692299 693273 700933 730119 730385 759375 
   170    194     96    137     49     65    176    231    275    313    205 
772232 772340 787476 787705 789039 
   286    247    240    184    149 

$finwgt
6084.762382383 6084.749363267 6084.748763328  393.890426751  641.647375466 
            90             61             50             48             48 
1462.436434424  593.037596627  895.030720016  342.509547149  934.989137039 
            47             45             44             37             37 
  702.57430816  645.096986799 6084.747889789  577.454052555   651.46204257 
            36             35             34             33             33 
 929.843069043  452.180288822  541.333365673  729.816382606  835.705455892 
            33             32             32             32             32 
 888.382540193   927.94099198  851.768379729  868.130099018  894.645660874 
            32             32             31             31             31 
 984.845596021  701.063606043  793.263666402   543.10044387  946.819967478 
            31             30             30             29             29 
1015.462088582 1016.149108108 1019.981866234 1040.468408082 1141.362079889 
            29             29             29             29             29 
1291.939451853 1329.790103112   182.06558616  743.973459478  794.640565906 
            29             29             28             28             28 
 898.543444732 1042.833088444 1131.481775528  1373.56145484   366.87804128 
            28             28             28             28             27 
 392.039206468  547.833907307  579.457069112  593.219832127  854.809873284 
            27             27             27             27             27 
 1048.47425302 1104.835457789 1159.516870486 1816.798230284 6054.100327083 
            27             27             27             27             27 
  606.95980431  818.085712533 1146.426800539  706.423256175  775.729833268 
            26             26             26             25             25 
 946.112967867  996.981564624 1025.880196581 1063.502080912 1119.667616736 
            25             25             25             25             25 
  1294.1057904 1315.317079036   6084.7477331  402.063366229  548.721336409 
            25             25             25             24             24 
 636.856583371  679.644603411  715.319618737  785.483271485  812.008313568 
            24             24             24             24             24 
 886.558267168  892.891330328  910.523814983 1034.181535833 1078.657221151 
            24             24             24             24             24 
1342.832937151 1746.901437456  424.255231699  572.255680335  772.304638451 
            24             24             23             23             23 
 815.808021393  916.165629612 1166.771298082 1225.819285873 1322.399990435 
            23             23             23             23             23 
 1374.74354602 1673.993155958 1750.253995437 6036.818568997    660.0342283 
            23             23             23             23             22 
  695.66010798  705.225188396  760.691396806  793.377847684        (Other) 
            22             22             22             22          14820 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
1907 1305  918  391 1738  616  578  144 2821  402  446  233 1875 1954  799 1584 

$Age
 >18   10   11   12   13   14   15   16   17   18    9 NA's 
 135    5  930 2454 2832 2735 2535 2440 2302 1251   23   69 

$female
FALSE  TRUE  NA's 
 8958  8622   131 

$Grade
            10             11             12              6              7 
          2509           2282           2130           2552           2845 
             8              9 Ungraded/Other           NA's 
          2773           2512             18             90 

$Not_HL
FALSE  TRUE 
 5400 12311 

$HL_Mex
FALSE  TRUE 
14975  2736 

$HL_PR
FALSE  TRUE 
17175   536 

$HL_Cub
FALSE  TRUE 
17450   261 

$HL_Other
FALSE  TRUE 
16073  1638 

$Race_AIAN
FALSE  TRUE 
16559  1152 

$Race_Asian
FALSE  TRUE 
16688  1023 

$Race_BAA
FALSE  TRUE 
14111  3600 

$Race_NHOPI
FALSE  TRUE 
17218   493 

$Race_White
FALSE  TRUE 
 6858 10853 

$ECIGT
FALSE  TRUE  NA's 
13681  3713   317 

$ECIGAR
FALSE  TRUE  NA's 
14379  2918   414 

$ESLT
FALSE  TRUE  NA's 
15993  1360   358 

$EELCIGT
FALSE  TRUE  NA's 
12727  4673   311 

$EROLLCIGTS
FALSE  TRUE  NA's 
16134   862   715 

$EBIDIS
FALSE  TRUE  NA's 
16751   245   715 

$EHOOKAH
FALSE  TRUE  NA's 
14752  2244   715 

$EPIPE
FALSE  TRUE  NA's 
16588   408   715 

$ESNUS
FALSE  TRUE  NA's 
16602   394   715 

$EDISSOLV
FALSE  TRUE  NA's 
16863   133   715 

$CCIGT
FALSE  TRUE  NA's 
16266  1081   364 

$CCIGAR
FALSE  TRUE  NA's 
16162  1006   543 

$CSLT
FALSE  TRUE  NA's 
16777   606   328 

$CELCIGT
FALSE  TRUE  NA's 
15485  1956   270 

$CROLLCIGTS
FALSE  TRUE  NA's 
16576   368   767 

$CBIDIS
FALSE  TRUE  NA's 
16854    90   767 

$CHOOKAH
FALSE  TRUE  NA's 
16084   860   767 

$CPIPE
FALSE  TRUE  NA's 
16807   137   767 

$CSNUS
FALSE  TRUE  NA's 
16796   148   767 

$CDISSOLV
FALSE  TRUE  NA's 
16890    54   767 

$brand_ecig
 NA's 
17711 

$menthol
 NA's 
17711 

$clove_spice
 NA's 
17711 

$fruit
 NA's 
17711 

$chocolate
 NA's 
17711 

$alcoholic_drink
 NA's 
17711 

$candy_dessert_sweets
 NA's 
17711 

$other
 NA's 
17711 

$no_use
 NA's 
17711 
$psu
073102 074571 086338 086458 086878 087003 087082 087577 087614 087717 087843 
   132    231    227     80    479    308     78    157    363    111    421 
087995 129241 172513 172966 173458 173584 173678 187262 187681 187822 188489 
   286    236     31    177    322    469    305    103    379    565    369 
229430 243383 243436 244656 245190 246395 258577 258711 258847 273327 286879 
   235    109    248     88    200    181    161    350     64    130     83 
300946 314704 314939 316875 329285 344685 372465 373302 373824 388878 400915 
   336    105    323    165    228    210    367    501    245    231    309 
415525 416045 458137 486124 486487 486627 514830 515814 515921 516441 529391 
   277    371    452    318    133    251    344    450    256    132    333 
530915 557654 560847 572477 587266 587583 600628 601255 603284 644416 644656 
   130    111    309    328    306    140    258    101    167    304    354 
673286 687909 688620 689327 689334 689463 690874 692321 692498 701278 731503 
   308    436    221    368    229    165    157    133    301    144    414 
758261 758520 758580 773513 787566 
   373    373    165    208    157 

$finwgt
 871.325553937 1294.137423906 1438.420759833  480.328096721 1836.652739308 
            52             44             44             39             37 
 460.564361052  688.756981919  376.209171932  967.677487198  321.964869964 
            36             35             34             33             31 
 348.981595173  473.352544161   688.65484377  903.144043691  550.786275093 
            31             31             31             31             30 
 565.667360783  376.294559675  409.581862696  655.970957179  801.149846011 
            30             29             29             29             29 
 498.103814457  505.529262349  644.407869578  675.378921273 1605.713123985 
            28             28             28             28             28 
 184.169787561  426.971622861  600.026114872   858.33511763    873.5009733 
            27             27             27             27             27 
 904.585522134  1021.75047314 1709.767600953  225.718687325  419.223596249 
            27             27             27             26             26 
 512.349969836   517.86340288  718.983714005   898.62053191   78.392010249 
            26             26             26             26             25 
 646.941982176  812.140722555 1126.021341565 1199.777295284 1366.024060394 
            25             25             25             25             25 
  87.913448816  133.016213317  279.688771464  467.702830527  523.431999531 
            24             24             24             24             24 
 567.324960779  620.558359876  632.341563731   964.27945255  980.937057493 
            24             24             24             24             24 
1039.842033152 1112.446942177 1317.836310254 1801.351760923 5924.173597737 
            24             24             24             24             24 
  526.09022941 1025.295175524 1594.189712455 2145.451026673  148.779868992 
            23             23             23             23             22 
 303.773166351  305.557190486  527.228440322  549.782141174  564.779037412 
            22             22             22             22             22 
 618.335209489   734.04886439  768.310439897  779.967411109  930.560748317 
            22             22             22             22             22 
 937.586106872  953.254427428   1001.9600149 1282.567263427 1387.558103013 
            22             22             22             22             22 
1578.327459457  5924.05941567  173.430526483  367.733687159  390.275834436 
            22             22             21             21             21 
 408.817821295  413.505336139  414.400979608  454.575264221  528.344027409 
            21             21             21             21             21 
 556.197272634  647.322112608  665.201650109  699.029992183  730.643402941 
            21             21             21             21             21 
 841.459471942   886.34862584  912.379281326  947.907438733        (Other) 
            21             21             21             21          18123 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
1938 1300  780  627 1756  989  509  775 2906  705  433  386 2027 1906 1975 1663 

$Age
   9   10   11   12   13   14   15   16   17   18   19 NA's 
  46    8 1297 2968 3195 3082 2785 2865 2681 1490  162   96 

$female
    1     2  NA's 
10438 10082   155 

$Grade
   6    7    8    9   10   11   12   13 NA's 
3235 3249 3174 2741 2809 2674 2673   16  104 

$Not_HL
    1  NA's 
14202  6473 

$HL_Mex
    1  NA's 
 3091 17584 

$HL_PR
    1  NA's 
  732 19943 

$HL_Cub
    1  NA's 
  190 20485 

$HL_Other
    1  NA's 
 2163 18512 

$Race_AIAN
    1  NA's 
 1752 18923 

$Race_Asian
    1  NA's 
 1567 19108 

$Race_BAA
    1  NA's 
 4607 16068 

$Race_NHOPI
    1  NA's 
  688 19987 

$Race_White
    1  NA's 
11661  9014 

$menthol
    1  NA's 
  833 19842 

$clove_spice
    1  NA's 
  113 20562 

$fruit
    1  NA's 
 1109 19566 

$chocolate
    1  NA's 
  230 20445 

$alcoholic_drink
    1  NA's 
  310 20365 

$candy_dessert_sweets
    1  NA's 
  700 19975 

$other
    1  NA's 
  505 20170 

$no_use
    1  NA's 
17877  2798 

$ECIGT
    1     2  NA's 
 3866 16376   433 

$ECIGAR
    1     2  NA's 
 3154 17082   439 

$ESLT
    1     2  NA's 
 1337 18873   465 

$EELCIGT
    1     2  NA's 
 4485 15801   389 

$EHOOKAH
    1     2  NA's 
 2140 17846   689 

$EROLLCIGTS
    1     2  NA's 
  970 18931   774 

$EPIPE
    1     2  NA's 
  467 19434   774 

$ESNUS
    1     2  NA's 
  650 19251   774 

$EDISSOLV
    1     2  NA's 
  219 19682   774 

$EBIDIS
    1     2  NA's 
  184 19717   774 

$CCIGT
    1     2  NA's 
  977 19215   483 

$CCIGAR
    1     2  NA's 
 1049 19193   433 

$CSLT
    1     2  NA's 
  526 19671   478 

$CELCIGT
    1     2  NA's 
 1514 18752   409 

$CHOOKAH
    1     2  NA's 
  733 19230   712 

$CROLLCIGTS
    1     2  NA's 
  481 19371   823 

$CPIPE
    1     2  NA's 
  214 19638   823 

$CSNUS
    1     2  NA's 
  280 19572   823 

$CDISSOLV
    1     2  NA's 
  132 19720   823 

$CBIDIS
    1     2  NA's 
   97 19755   823 

$brand_ecig
 NA's 
20675 
$psu
073102 074571 086338 086458 086878 087003 087082 087577 087614 087717 087843 
   132    231    227     80    479    308     78    157    363    111    421 
087995 129241 172513 172966 173458 173584 173678 187262 187681 187822 188489 
   286    236     31    177    322    469    305    103    379    565    369 
229430 243383 243436 244656 245190 246395 258577 258711 258847 273327 286879 
   235    109    248     88    200    181    161    350     64    130     83 
300946 314704 314939 316875 329285 344685 372465 373302 373824 388878 400915 
   336    105    323    165    228    210    367    501    245    231    309 
415525 416045 458137 486124 486487 486627 514830 515814 515921 516441 529391 
   277    371    452    318    133    251    344    450    256    132    333 
530915 557654 560847 572477 587266 587583 600628 601255 603284 644416 644656 
   130    111    309    328    306    140    258    101    167    304    354 
673286 687909 688620 689327 689334 689463 690874 692321 692498 701278 731503 
   308    436    221    368    229    165    157    133    301    144    414 
758261 758520 758580 773513 787566 
   373    373    165    208    157 

$finwgt
 871.325553937 1294.137423906 1438.420759833  480.328096721 1836.652739308 
            52             44             44             39             37 
 460.564361052  688.756981919  376.209171932  967.677487198  321.964869964 
            36             35             34             33             31 
 348.981595173  473.352544161   688.65484377  903.144043691  550.786275093 
            31             31             31             31             30 
 565.667360783  376.294559675  409.581862696  655.970957179  801.149846011 
            30             29             29             29             29 
 498.103814457  505.529262349  644.407869578  675.378921273 1605.713123985 
            28             28             28             28             28 
 184.169787561  426.971622861  600.026114872   858.33511763    873.5009733 
            27             27             27             27             27 
 904.585522134  1021.75047314 1709.767600953  225.718687325  419.223596249 
            27             27             27             26             26 
 512.349969836   517.86340288  718.983714005   898.62053191   78.392010249 
            26             26             26             26             25 
 646.941982176  812.140722555 1126.021341565 1199.777295284 1366.024060394 
            25             25             25             25             25 
  87.913448816  133.016213317  279.688771464  467.702830527  523.431999531 
            24             24             24             24             24 
 567.324960779  620.558359876  632.341563731   964.27945255  980.937057493 
            24             24             24             24             24 
1039.842033152 1112.446942177 1317.836310254 1801.351760923 5924.173597737 
            24             24             24             24             24 
  526.09022941 1025.295175524 1594.189712455 2145.451026673  148.779868992 
            23             23             23             23             22 
 303.773166351  305.557190486  527.228440322  549.782141174  564.779037412 
            22             22             22             22             22 
 618.335209489   734.04886439  768.310439897  779.967411109  930.560748317 
            22             22             22             22             22 
 937.586106872  953.254427428   1001.9600149 1282.567263427 1387.558103013 
            22             22             22             22             22 
1578.327459457  5924.05941567  173.430526483  367.733687159  390.275834436 
            22             22             21             21             21 
 408.817821295  413.505336139  414.400979608  454.575264221  528.344027409 
            21             21             21             21             21 
 556.197272634  647.322112608  665.201650109  699.029992183  730.643402941 
            21             21             21             21             21 
 841.459471942   886.34862584  912.379281326  947.907438733        (Other) 
            21             21             21             21          18123 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
1938 1300  780  627 1756  989  509  775 2906  705  433  386 2027 1906 1975 1663 

$Age
 >18   10   11   12   13   14   15   16   17   18    9 NA's 
 162    8 1297 2968 3195 3082 2785 2865 2681 1490   46   96 

$female
FALSE  TRUE  NA's 
10438 10082   155 

$Grade
            10             11             12              6              7 
          2809           2674           2673           3235           3249 
             8              9 Ungraded/Other           NA's 
          3174           2741             16            104 

$Not_HL
FALSE  TRUE 
 6473 14202 

$HL_Mex
FALSE  TRUE 
17584  3091 

$HL_PR
FALSE  TRUE 
19943   732 

$HL_Cub
FALSE  TRUE 
20485   190 

$HL_Other
FALSE  TRUE 
18512  2163 

$Race_AIAN
FALSE  TRUE 
18923  1752 

$Race_Asian
FALSE  TRUE 
19108  1567 

$Race_BAA
FALSE  TRUE 
16068  4607 

$Race_NHOPI
FALSE  TRUE 
19987   688 

$Race_White
FALSE  TRUE 
 9014 11661 

$menthol
FALSE  TRUE 
19842   833 

$clove_spice
FALSE  TRUE 
20562   113 

$fruit
FALSE  TRUE 
19566  1109 

$chocolate
FALSE  TRUE 
20445   230 

$alcoholic_drink
FALSE  TRUE 
20365   310 

$candy_dessert_sweets
FALSE  TRUE 
19975   700 

$other
FALSE  TRUE 
20170   505 

$no_use
FALSE  TRUE 
 2798 17877 

$ECIGT
FALSE  TRUE 
16809  3866 

$ECIGAR
FALSE  TRUE 
17521  3154 

$ESLT
FALSE  TRUE 
19338  1337 

$EELCIGT
FALSE  TRUE 
16190  4485 

$EHOOKAH
FALSE  TRUE 
18535  2140 

$EROLLCIGTS
FALSE  TRUE 
19705   970 

$EPIPE
FALSE  TRUE 
20208   467 

$ESNUS
FALSE  TRUE 
20025   650 

$EDISSOLV
FALSE  TRUE 
20456   219 

$EBIDIS
FALSE  TRUE 
20491   184 

$CCIGT
FALSE  TRUE 
19698   977 

$CCIGAR
FALSE  TRUE 
19626  1049 

$CSLT
FALSE  TRUE 
20149   526 

$CELCIGT
FALSE  TRUE 
19161  1514 

$CHOOKAH
FALSE  TRUE 
19942   733 

$CROLLCIGTS
FALSE  TRUE 
20194   481 

$CPIPE
FALSE  TRUE 
20461   214 

$CSNUS
FALSE  TRUE 
20395   280 

$CDISSOLV
FALSE  TRUE 
20543   132 

$CBIDIS
FALSE  TRUE 
20578    97 

$brand_ecig
 NA's 
20675 
$psu
014595 058385 086452 086889 086972 087144 087174 087568 087858 088152 115262 
   354    165    296    240    268    188    314    318     93    129    278 
129060 129751 142976 171594 173094 173711 174186 174258 186117 188113 188207 
   256    170    252    116    160    226    249    318    341    288    320 
188307 243848 245033 258883 259591 259810 274380 301900 302266 314736 343581 
   421    134    148    140    274    167    189    188    309    370    213 
343702 344106 344317 350305 373245 373427 374076 374456 387897 400362 401050 
   394    265     60     75    164    463    293    336    203    229     81 
418326 487115 487123 501078 515682 515683 515792 515990 516100 516335 530582 
   193    182     37    240    257     68    208    364    172    189    379 
558771 559447 559816 585762 586736 600815 602062 602173 602417 602425 644424 
   283    155    137     72    178    531    206    129    169     87    158 
672182 674270 686434 686767 689716 690913 692424 692818 693010 701295 729632 
   205    174    138     32    276    185    421    217     34    168    285 
730705 757723 758362 758663 772237 
   184    171    185    174    174 

$finwgt
 388.086140156  471.940845283  390.583989416  405.380567077  472.183232467 
            51             49             48             48             47 
  724.56606859 1784.368053098  518.253252285   787.40156861 1058.307376853 
            35             35             33             32             31 
 6505.08401827  666.989424614  759.980607023  855.933815842  480.026932681 
            31             30             30             30             29 
 848.614920471  926.022139243 2054.047484589  199.574079216  398.046267884 
            29             29             29             28             28 
 632.528237732  265.565422115  434.241886925  479.524141762   603.41343573 
            28             27             27             27             27 
2481.307388658  206.462147383  316.796633448   460.22386269  697.047119656 
            27             26             26             26             26 
 807.931561134  881.176565371 1277.075266177  208.231781084   446.05788661 
            26             26             26             25             25 
 491.359940944  543.904772031  826.431573503 1666.670226291 2107.763960713 
            25             25             25             25             25 
 160.937199594  212.899945196  372.505372275  715.045700881   867.20325432 
            24             24             24             24             24 
 994.573293824 1270.103663994 1369.362294624  131.733679461  393.994795267 
            24             24             24             23             23 
 409.742815639  506.068428826  649.586475366  833.801586236 1053.241357521 
            23             23             23             23             23 
1075.316452245 1097.264887598 1472.297231462 2471.826577818 6505.083867486 
            23             23             23             23             23 
 100.878347987  168.013153338  380.795649055  469.240664401    538.7376444 
            22             22             22             22             22 
 564.525712854  605.326863684  631.400184035  734.054217019  974.402999538 
            22             22             22             22             22 
 1041.12052098 1113.839139761 1157.153752424 1717.302420506  244.503033338 
            22             22             22             22             21 
 291.475998553  320.204350521  322.837800152  410.491377261  565.365433905 
            21             21             21             21             21 
 845.653652239  865.290461476  931.797436444 1054.095980076 1063.980316558 
            21             21             21             21             21 
1280.057483708 1527.232038241 6491.921224713  384.116284763  532.124703938 
            21             21             21             20             20 
 549.714915274  657.596180463  966.440787959 1161.610230855 1197.989688589 
            20             20             20             20             20 
 1278.78119818 1499.591207108 1747.734538876 1816.850159172        (Other) 
            20             20             20             20          15360 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
1865  968 1087 1021 1205  930 1318  711 2493  249  707  323 1546 1654  697 1098 

$Age
   9   10   11   12   13   14   15   16   17   18   19 NA's 
  36   12 1018 2413 2495 2479 2704 2588 2525 1361  146   95 

$female
   1    2 NA's 
8881 8815  176 

$Grade
   6    7    8    9   10   11   12   13 NA's 
2524 2565 2473 2583 2637 2575 2391   25   99 

$Not_HL
    1  NA's 
12696  5176 

$HL_Mex
    1  NA's 
 2190 15682 

$HL_PR
    1  NA's 
  527 17345 

$HL_Cub
    1  NA's 
  220 17652 

$HL_Other
    1  NA's 
 1970 15902 

$Race_AIAN
    1  NA's 
 1186 16686 

$Race_Asian
    1  NA's 
 1216 16656 

$Race_BAA
    1  NA's 
 4328 13544 

$Race_NHOPI
    1  NA's 
  526 17346 

$Race_White
    1  NA's 
10478  7394 

$menthol
    1  NA's 
  748 17124 

$clove_spice
    1  NA's 
   89 17783 

$fruit
    1  NA's 
 1024 16848 

$chocolate
    1  NA's 
  203 17669 

$alcoholic_drink
    1  NA's 
  321 17551 

$candy_dessert_sweets
    1  NA's 
  620 17252 

$other
    1  NA's 
  434 17438 

$no_use
    1  NA's 
15421  2451 

$ECIGT
    1     2  NA's 
 3107 14433   332 

$ECIGAR
    1     2  NA's 
 2495 14991   386 

$ESLT
    1     2  NA's 
 1151 16277   444 

$EELCIGT
    1     2  NA's 
 3695 13754   423 

$EHOOKAH
    1     2  NA's 
 1456 16003   413 

$EROLLCIGTS
    1     2  NA's 
  819 16517   536 

$EPIPE
    1     2  NA's 
  361 16975   536 

$ESNUS
    1     2  NA's 
  648 16688   536 

$EDISSOLV
    1     2  NA's 
  229 17107   536 

$EBIDIS
    1     2  NA's 
  232 17104   536 

$CCIGT
    1     2  NA's 
  973 16461   438 

$CCIGAR
    1     2  NA's 
  977 16439   456 

$CSLT
    1     2  NA's 
  510 16795   567 

$CELCIGT
    1     2  NA's 
 1360 16210   302 

$CHOOKAH
    1     2  NA's 
  508 16880   484 

$CROLLCIGTS
    1     2  NA's 
  369 16959   544 

$CPIPE
    1     2  NA's 
  137 17191   544 

$CSNUS
    1     2  NA's 
  249 17079   544 

$CDISSOLV
    1     2  NA's 
  105 17223   544 

$CBIDIS
    1     2  NA's 
  105 17223   544 

$brand_ecig
 NA's 
17872 
$psu
014595 058385 086452 086889 086972 087144 087174 087568 087858 088152 115262 
   354    165    296    240    268    188    314    318     93    129    278 
129060 129751 142976 171594 173094 173711 174186 174258 186117 188113 188207 
   256    170    252    116    160    226    249    318    341    288    320 
188307 243848 245033 258883 259591 259810 274380 301900 302266 314736 343581 
   421    134    148    140    274    167    189    188    309    370    213 
343702 344106 344317 350305 373245 373427 374076 374456 387897 400362 401050 
   394    265     60     75    164    463    293    336    203    229     81 
418326 487115 487123 501078 515682 515683 515792 515990 516100 516335 530582 
   193    182     37    240    257     68    208    364    172    189    379 
558771 559447 559816 585762 586736 600815 602062 602173 602417 602425 644424 
   283    155    137     72    178    531    206    129    169     87    158 
672182 674270 686434 686767 689716 690913 692424 692818 693010 701295 729632 
   205    174    138     32    276    185    421    217     34    168    285 
730705 757723 758362 758663 772237 
   184    171    185    174    174 

$finwgt
 388.086140156  471.940845283  390.583989416  405.380567077  472.183232467 
            51             49             48             48             47 
  724.56606859 1784.368053098  518.253252285   787.40156861 1058.307376853 
            35             35             33             32             31 
 6505.08401827  666.989424614  759.980607023  855.933815842  480.026932681 
            31             30             30             30             29 
 848.614920471  926.022139243 2054.047484589  199.574079216  398.046267884 
            29             29             29             28             28 
 632.528237732  265.565422115  434.241886925  479.524141762   603.41343573 
            28             27             27             27             27 
2481.307388658  206.462147383  316.796633448   460.22386269  697.047119656 
            27             26             26             26             26 
 807.931561134  881.176565371 1277.075266177  208.231781084   446.05788661 
            26             26             26             25             25 
 491.359940944  543.904772031  826.431573503 1666.670226291 2107.763960713 
            25             25             25             25             25 
 160.937199594  212.899945196  372.505372275  715.045700881   867.20325432 
            24             24             24             24             24 
 994.573293824 1270.103663994 1369.362294624  131.733679461  393.994795267 
            24             24             24             23             23 
 409.742815639  506.068428826  649.586475366  833.801586236 1053.241357521 
            23             23             23             23             23 
1075.316452245 1097.264887598 1472.297231462 2471.826577818 6505.083867486 
            23             23             23             23             23 
 100.878347987  168.013153338  380.795649055  469.240664401    538.7376444 
            22             22             22             22             22 
 564.525712854  605.326863684  631.400184035  734.054217019  974.402999538 
            22             22             22             22             22 
 1041.12052098 1113.839139761 1157.153752424 1717.302420506  244.503033338 
            22             22             22             22             21 
 291.475998553  320.204350521  322.837800152  410.491377261  565.365433905 
            21             21             21             21             21 
 845.653652239  865.290461476  931.797436444 1054.095980076 1063.980316558 
            21             21             21             21             21 
1280.057483708 1527.232038241 6491.921224713  384.116284763  532.124703938 
            21             21             21             20             20 
 549.714915274  657.596180463  966.440787959 1161.610230855 1197.989688589 
            20             20             20             20             20 
 1278.78119818 1499.591207108 1747.734538876 1816.850159172        (Other) 
            20             20             20             20          15360 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
1865  968 1087 1021 1205  930 1318  711 2493  249  707  323 1546 1654  697 1098 

$Age
 >18   10   11   12   13   14   15   16   17   18    9 NA's 
 146   12 1018 2413 2495 2479 2704 2588 2525 1361   36   95 

$female
FALSE  TRUE  NA's 
 8881  8815   176 

$Grade
            10             11             12              6              7 
          2637           2575           2391           2524           2565 
             8              9 Ungraded/Other           NA's 
          2473           2583             25             99 

$Not_HL
FALSE  TRUE 
 5176 12696 

$HL_Mex
FALSE  TRUE 
15682  2190 

$HL_PR
FALSE  TRUE 
17345   527 

$HL_Cub
FALSE  TRUE 
17652   220 

$HL_Other
FALSE  TRUE 
15902  1970 

$Race_AIAN
FALSE  TRUE 
16686  1186 

$Race_Asian
FALSE  TRUE 
16656  1216 

$Race_BAA
FALSE  TRUE 
13544  4328 

$Race_NHOPI
FALSE  TRUE 
17346   526 

$Race_White
FALSE  TRUE 
 7394 10478 

$menthol
FALSE  TRUE 
17124   748 

$clove_spice
FALSE  TRUE 
17783    89 

$fruit
FALSE  TRUE 
16848  1024 

$chocolate
FALSE  TRUE 
17669   203 

$alcoholic_drink
FALSE  TRUE 
17551   321 

$candy_dessert_sweets
FALSE  TRUE 
17252   620 

$other
FALSE  TRUE 
17438   434 

$no_use
FALSE  TRUE 
 2451 15421 

$ECIGT
FALSE  TRUE 
14765  3107 

$ECIGAR
FALSE  TRUE 
15377  2495 

$ESLT
FALSE  TRUE 
16721  1151 

$EELCIGT
FALSE  TRUE 
14177  3695 

$EHOOKAH
FALSE  TRUE 
16416  1456 

$EROLLCIGTS
FALSE  TRUE 
17053   819 

$EPIPE
FALSE  TRUE 
17511   361 

$ESNUS
FALSE  TRUE 
17224   648 

$EDISSOLV
FALSE  TRUE 
17643   229 

$EBIDIS
FALSE  TRUE 
17640   232 

$CCIGT
FALSE  TRUE 
16899   973 

$CCIGAR
FALSE  TRUE 
16895   977 

$CSLT
FALSE  TRUE 
17362   510 

$CELCIGT
FALSE  TRUE 
16512  1360 

$CHOOKAH
FALSE  TRUE 
17364   508 

$CROLLCIGTS
FALSE  TRUE 
17503   369 

$CPIPE
FALSE  TRUE 
17735   137 

$CSNUS
FALSE  TRUE 
17623   249 

$CDISSOLV
FALSE  TRUE 
17767   105 

$CBIDIS
FALSE  TRUE 
17767   105 

$brand_ecig
 NA's 
17872 
$psu
015659 057544 058063 058279 058342 086286 086582 086634 086775 086958 086993 
   131     83    241    231    177    223     54    288    250     84    216 
087009 087143 087205 087214 087537 088258 088304 143354 144110 172268 172362 
   238    133    222    187    183    270     72    372    307    214    249 
172827 173483 173518 173614 187069 187695 188339 188792 188841 190174 243742 
   192    368    373    155    252     15    383    156    382    368    344 
243772 244646 245531 245863 246106 258141 259259 259407 273856 303189 314614 
   171    148    320    300    116     84     86    148     61    274    264 
315356 315841 316022 344472 357756 371868 372907 373105 374569 387227 388116 
   301    317    364    319    166     59    195    317    166    322     25 
415354 415942 457785 458247 472607 486733 487266 500919 514921 516648 529004 
   134     64    213    182    103     78    166     83     64    165    284 
529849 559574 559658 572256 600729 601533 601983 602020 603179 629054 644674 
   352    312    197    417    290    406    374     45     71    161    328 
672288 673839 674805 686156 687050 687585 687958 688552 689044 689416 689634 
   274    277    320    119    126     90    144    303    264     86    305 
690574 692282 700978 701250 736480 757540 759020 
   182    253    125     15    394    235    252 

$finwgt
4990.707825052  372.106445056  374.223712424  438.895059192  512.773737505 
            73             54             53             53             50 
4990.707824997  354.403367156  459.264157663  794.117545838 4990.707825184 
            46             38             38             35             35 
 261.594994077  604.212351194  464.262746508  526.352614715  243.614971982 
            34             34             33             31             30 
 716.756339454 1133.236763357 1063.013428506  499.309679476  725.642399133 
            30             30             29             28             28 
 955.117892997  533.302805442  878.385000967  884.736590151  615.101958781 
            28             27             27             27             26 
 656.112273243  763.304212486  772.024461398  804.949783275  436.289029717 
            26             26             26             26             25 
1075.075363375  1116.00695267 1120.843771262 1208.191548298 1364.127973987 
            25             25             25             25             25 
3176.705125185  359.909264221  501.302998165  639.387801493  672.915273738 
            25             24             24             24             24 
 750.014182644  768.617690322  772.265673267  872.656690614  925.421592037 
            24             24             24             24             24 
 925.454369278  934.553252225  997.238713858 1060.007709052 1921.985860852 
            24             24             24             24             24 
4989.824123193  230.825021393  592.209826559  637.612536618 1173.734572865 
            24             23             23             23             23 
1215.661901874 1397.810883406 1455.757503148 2086.599584044 4943.253945798 
            23             23             23             23             23 
4965.403983968  358.261960805  610.908165514  643.867829284  662.274116541 
            23             22             22             22             22 
 755.668600945  792.397022445  890.114756698 1000.670065114 1121.902399257 
            22             22             22             22             22 
1216.404436426  1484.57374707   1918.7838166 2132.519656006  285.715212581 
            22             22             22             22             21 
 435.458751085  488.084421785  502.351127283  546.319362206  601.212956081 
            21             21             21             21             21 
 635.885463139  662.109306082  753.224172586  757.829169717  809.249572869 
            21             21             21             21             21 
 847.008048039  966.525436209 1007.915531153 1060.586057955 1100.972041909 
            21             21             21             21             21 
1167.285951387 1271.451496438  104.948041269  303.014353117  306.179881848 
            21             21             20             20             20 
 400.963911867  516.160638629  669.231249605   691.04417579        (Other) 
            20             20             20             20          17599 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
2346 1575 1170  621 1849 1114  548  742 2392  862  774  559 1731 1430 1160 1316 

$Age
   9   10   11   12   13   14   15   16   17   18   19 NA's 
  58    6 1007 2875 3013 2930 2881 2789 2719 1630  162  119 

$female
    1     2  NA's 
10069  9920   200 

$Grade
   6    7    8    9   10   11   12   13 NA's 
2903 3140 3012 2935 2664 2824 2568   16  127 

$Not_HL
    1  NA's 
13766  6423 

$HL_Mex
    1  NA's 
 3065 17124 

$HL_PR
    1  NA's 
  657 19532 

$HL_Cub
    1  NA's 
  345 19844 

$HL_Other
    1  NA's 
 2102 18087 

$Race_AIAN
    1  NA's 
 1592 18597 

$Race_Asian
    1  NA's 
 1219 18970 

$Race_BAA
    1  NA's 
 3836 16353 

$Race_NHOPI
    1  NA's 
  577 19612 

$Race_White
    1  NA's 
12624  7565 

$menthol
    1  NA's 
 1251 18938 

$clove_spice
    1  NA's 
  104 20085 

$fruit
    1  NA's 
 1789 18400 

$chocolate
    1  NA's 
  249 19940 

$alcoholic_drink
    1  NA's 
  364 19825 

$candy_dessert_sweets
    1  NA's 
 1138 19051 

$other
    1  NA's 
  755 19434 

$no_use
    1  NA's 
16605  3584 

$ECIGT
    1     2  NA's 
 3559 16268   362 

$ECIGAR
    1     2  NA's 
 2876 16831   482 

$ESLT
    1     2  NA's 
 1444 18194   551 

$EELCIGT
    1     2  NA's 
 5071 14572   546 

$EHOOKAH
    1     2  NA's 
 1433 18239   517 

$EROLLCIGTS
    1     2  NA's 
  953 18513   723 

$EPIPE
    1     2  NA's 
  451 19015   723 

$ESNUS
    1     2  NA's 
  837 18629   723 

$EDISSOLV
    1     2  NA's 
  278 19188   723 

$EBIDIS
    1     2  NA's 
  274 19192   723 

$CCIGT
    1     2  NA's 
 1099 18578   512 

$CCIGAR
    1     2  NA's 
 1061 18601   527 

$CSLT
    1     2  NA's 
  623 18812   754 

$CELCIGT
    1     2  NA's 
 2703 17066   420 

$CHOOKAH
    1     2  NA's 
  564 18992   633 

$CROLLCIGTS
    1     2  NA's 
  433 19026   730 

$CPIPE
    1     2  NA's 
  175 19284   730 

$CSNUS
    1     2  NA's 
  332 19127   730 

$CDISSOLV
    1     2  NA's 
  112 19347   730 

$CBIDIS
    1     2  NA's 
  108 19351   730 

$brand_ecig
 NA's 
20189 
$psu
015659 057544 058063 058279 058342 086286 086582 086634 086775 086958 086993 
   131     83    241    231    177    223     54    288    250     84    216 
087009 087143 087205 087214 087537 088258 088304 143354 144110 172268 172362 
   238    133    222    187    183    270     72    372    307    214    249 
172827 173483 173518 173614 187069 187695 188339 188792 188841 190174 243742 
   192    368    373    155    252     15    383    156    382    368    344 
243772 244646 245531 245863 246106 258141 259259 259407 273856 303189 314614 
   171    148    320    300    116     84     86    148     61    274    264 
315356 315841 316022 344472 357756 371868 372907 373105 374569 387227 388116 
   301    317    364    319    166     59    195    317    166    322     25 
415354 415942 457785 458247 472607 486733 487266 500919 514921 516648 529004 
   134     64    213    182    103     78    166     83     64    165    284 
529849 559574 559658 572256 600729 601533 601983 602020 603179 629054 644674 
   352    312    197    417    290    406    374     45     71    161    328 
672288 673839 674805 686156 687050 687585 687958 688552 689044 689416 689634 
   274    277    320    119    126     90    144    303    264     86    305 
690574 692282 700978 701250 736480 757540 759020 
   182    253    125     15    394    235    252 

$finwgt
4990.707825052  372.106445056  374.223712424  438.895059192  512.773737505 
            73             54             53             53             50 
4990.707824997  354.403367156  459.264157663  794.117545838 4990.707825184 
            46             38             38             35             35 
 261.594994077  604.212351194  464.262746508  526.352614715  243.614971982 
            34             34             33             31             30 
 716.756339454 1133.236763357 1063.013428506  499.309679476  725.642399133 
            30             30             29             28             28 
 955.117892997  533.302805442  878.385000967  884.736590151  615.101958781 
            28             27             27             27             26 
 656.112273243  763.304212486  772.024461398  804.949783275  436.289029717 
            26             26             26             26             25 
1075.075363375  1116.00695267 1120.843771262 1208.191548298 1364.127973987 
            25             25             25             25             25 
3176.705125185  359.909264221  501.302998165  639.387801493  672.915273738 
            25             24             24             24             24 
 750.014182644  768.617690322  772.265673267  872.656690614  925.421592037 
            24             24             24             24             24 
 925.454369278  934.553252225  997.238713858 1060.007709052 1921.985860852 
            24             24             24             24             24 
4989.824123193  230.825021393  592.209826559  637.612536618 1173.734572865 
            24             23             23             23             23 
1215.661901874 1397.810883406 1455.757503148 2086.599584044 4943.253945798 
            23             23             23             23             23 
4965.403983968  358.261960805  610.908165514  643.867829284  662.274116541 
            23             22             22             22             22 
 755.668600945  792.397022445  890.114756698 1000.670065114 1121.902399257 
            22             22             22             22             22 
1216.404436426  1484.57374707   1918.7838166 2132.519656006  285.715212581 
            22             22             22             22             21 
 435.458751085  488.084421785  502.351127283  546.319362206  601.212956081 
            21             21             21             21             21 
 635.885463139  662.109306082  753.224172586  757.829169717  809.249572869 
            21             21             21             21             21 
 847.008048039  966.525436209 1007.915531153 1060.586057955 1100.972041909 
            21             21             21             21             21 
1167.285951387 1271.451496438  104.948041269  303.014353117  306.179881848 
            21             21             20             20             20 
 400.963911867  516.160638629  669.231249605   691.04417579        (Other) 
            20             20             20             20          17599 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
2346 1575 1170  621 1849 1114  548  742 2392  862  774  559 1731 1430 1160 1316 

$Age
 >18   10   11   12   13   14   15   16   17   18    9 NA's 
 162    6 1007 2875 3013 2930 2881 2789 2719 1630   58  119 

$female
FALSE  TRUE  NA's 
10069  9920   200 

$Grade
            10             11             12              6              7 
          2664           2824           2568           2903           3140 
             8              9 Ungraded/Other           NA's 
          3012           2935             16            127 

$Not_HL
FALSE  TRUE 
 6423 13766 

$HL_Mex
FALSE  TRUE 
17124  3065 

$HL_PR
FALSE  TRUE 
19532   657 

$HL_Cub
FALSE  TRUE 
19844   345 

$HL_Other
FALSE  TRUE 
18087  2102 

$Race_AIAN
FALSE  TRUE 
18597  1592 

$Race_Asian
FALSE  TRUE 
18970  1219 

$Race_BAA
FALSE  TRUE 
16353  3836 

$Race_NHOPI
FALSE  TRUE 
19612   577 

$Race_White
FALSE  TRUE 
 7565 12624 

$menthol
FALSE  TRUE 
18938  1251 

$clove_spice
FALSE  TRUE 
20085   104 

$fruit
FALSE  TRUE 
18400  1789 

$chocolate
FALSE  TRUE 
19940   249 

$alcoholic_drink
FALSE  TRUE 
19825   364 

$candy_dessert_sweets
FALSE  TRUE 
19051  1138 

$other
FALSE  TRUE 
19434   755 

$no_use
FALSE  TRUE 
 3584 16605 

$ECIGT
FALSE  TRUE  NA's 
16268  3559   362 

$ECIGAR
FALSE  TRUE  NA's 
16831  2876   482 

$ESLT
FALSE  TRUE  NA's 
18194  1444   551 

$EELCIGT
FALSE  TRUE  NA's 
14572  5071   546 

$EHOOKAH
FALSE  TRUE  NA's 
18239  1433   517 

$EROLLCIGTS
FALSE  TRUE  NA's 
18513   953   723 

$EPIPE
FALSE  TRUE  NA's 
19015   451   723 

$ESNUS
FALSE  TRUE  NA's 
18629   837   723 

$EDISSOLV
FALSE  TRUE  NA's 
19188   278   723 

$EBIDIS
FALSE  TRUE  NA's 
19192   274   723 

$CCIGT
FALSE  TRUE  NA's 
18578  1099   512 

$CCIGAR
FALSE  TRUE  NA's 
18601  1061   527 

$CSLT
FALSE  TRUE  NA's 
18812   623   754 

$CELCIGT
FALSE  TRUE  NA's 
17066  2703   420 

$CHOOKAH
FALSE  TRUE  NA's 
18992   564   633 

$CROLLCIGTS
FALSE  TRUE  NA's 
19026   433   730 

$CPIPE
FALSE  TRUE  NA's 
19284   175   730 

$CSNUS
FALSE  TRUE  NA's 
19127   332   730 

$CDISSOLV
FALSE  TRUE  NA's 
19347   112   730 

$CBIDIS
FALSE  TRUE  NA's 
19351   108   730 

$brand_ecig
 NA's 
20189 
$psu
 58123  73728  73914  86357  86380  86698  86869  86877  86997  87107  87479 
   291    167    171    205    262     94    178    346    220     71    222 
 87601  87669  87860  87876  88243 171990 172758 173174 173515 173535 173649 
   184    198    240    187    162    271    305     68    337    186    204 
186909 187981 229278 243490 243700 244840 258416 259834 274204 287241 300785 
   133    345    380    480    114    160    146    134    264    134    316 
300814 303802 316013 358608 373709 374512 374814 386930 387529 401006 401530 
   331    249    367     41    433    191    268    422    362    279    170 
415984 416340 416550 417008 445315 486486 487128 487177 487457 487518 501192 
   282     92    133    218    247    286    305    312     91    167    189 
514427 515669 516003 516819 516849 529165 529557 530666 531454 543901 559013 
   125     84    268    145    227    219    104    140    267    304    267 
559459 586535 601420 601577 601913 602241 602677 674314 686520 688517 688727 
   313    150    286    328     24    384    112    126    165     51    136 
688871 689471 689962 690649 690720 693247 701384 729538 729920 732232 757899 
   137    199    147    236    146    117    203    138    100    164    298 
758808 758911 800237 
   146     92     60 

$finwgt
298.94381695 1349.5698631 546.11348506 691.07608343 5285.5332095 456.58921394 
          35           34           33           33           33           30 
1814.6246166 676.96068381 745.55326355 876.04021216 1592.6392583 1162.7807537 
          30           29           29           29           29           28 
188.96218054 436.15905944 878.15523472 1110.4917206 305.78828093  316.2159641 
          27           27           27           27           26           26 
 511.1744348 646.15466161 690.19319279 1154.5213819 1159.6037522 1405.2169869 
          26           26           26           26           26           26 
674.64725539 825.52309574  884.6807423 925.71486779 1164.6450091  1362.316235 
          25           25           25           25           25           25 
558.25390758 625.53648288  839.6866944 882.78302229 886.20209942 1338.2350647 
          24           24           24           24           24           24 
1772.9717327 225.52526803 792.71025137 911.95033723 956.70266731 353.79114524 
          24           23           23           23           23           22 
507.50355235 739.96695295 775.05061994 887.67803637 1111.0008494 1194.6677527 
          22           22           22           22           22           22 
1278.4328612 1363.8639539 1642.2200913 11.150042919 16.065197906 172.15949442 
          22           22           22           21           21           21 
  414.949031 710.93532098 780.25920379 1023.8115393 1203.6836641 1444.3893222 
          21           21           21           21           21           21 
4411.7913281 178.47168745 566.73417786 631.63868903 670.49736758 728.77064723 
          21           20           20           20           20           20 
741.08110309 765.27178212 790.13593556 864.21130384 876.30041914 934.24093605 
          20           20           20           20           20           20 
1114.3023069  1179.018274 1232.8285309  1260.744969 1601.8637426 1756.8757857 
          20           20           20           20           20           20 
5183.3811612 5268.5549579 78.116704202 436.74312217 679.42299971 940.82420216 
          20           20           19           19           19           19 
963.51307711 1210.2995777 1366.7316106 1369.8132126 1403.0995315 1453.5670628 
          19           19           19           19           19           19 
 1952.421273 350.36503801 512.19207166 557.49460422 623.97616918 653.51170585 
          19           18           18           18           18           18 
697.41131479 751.91370328 799.96587077      (Other) 
          18           18           18        16757 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
2024  716  843  226 2664 1202  268  369 2958  714  665  688 2553 1001  917 1210 

$Age
   9   10   11   12   13   14   15   16   17   18   19 NA's 
  35   19 1108 2789 3078 2810 2593 2523 2527 1376  122   38 

$female
  .N    1    2 
 116 9803 9099 

$Grade
   6    7    8    9   10   11   12   13 NA's 
2944 3024 2869 2790 2499 2502 2306   27   57 

$Not_HL
   .N    .Z     1  NA's 
  334     2 13118  5564 

$HL_Mex
   .N    .Z     1  NA's 
  334     2  3060 15622 

$HL_PR
   .N    .Z     1  NA's 
  334     2   536 18146 

$HL_Cub
   .N    .Z     1  NA's 
  334     2   213 18469 

$HL_Other
   .N    .Z     1  NA's 
  334     2  2141 16541 

$brand_ecig
   .N    .S    .Z     1     2     3     4     5     6     7     8 
   60 15340    14   528   111  2028    36    32    44   100   725 

$Race_AIAN
   .N    .Z     1  NA's 
 1161     2  1536 16319 

$Race_Asian
   .N    .Z     1  NA's 
 1161     2  1443 16412 

$Race_BAA
   .N    .Z     1  NA's 
 1161     2  3675 14180 

$Race_NHOPI
   .N    .Z     1  NA's 
 1161     2   666 17189 

$Race_White
   .N    .Z     1  NA's 
 1161     2 12291  5564 

$ECIGT
    1     2     M 
 2931 16061    26 

$ECIGAR
    1     2     M 
 2541 16441    36 

$ESLT
    1     2     M 
 1270 17704    44 

$EELCIGT
    1     2     M 
 6409 12563    46 

$EHOOKAH
    1     2     M 
 1289 17675    54 

$EROLLCIGTS
    1     2     M 
  832 18005   181 

$EPIPE
    1     2     M 
  489 18336   193 

$ESNUS
    1     2     M 
  616 18209   193 

$EDISSOLV
    1     2     M 
  244 18583   191 

$EBIDIS
    1     2     M 
  221 18605   192 

$CCIGT
    1     2     M 
  748 18227    43 

$CCIGAR
    1     2     M 
  930 18028    60 

$CSLT
    1     2     M 
  531 18441    46 

$CELCIGT
    1     2     M 
 3628 15286   104 

$CHOOKAH
    1     2     M 
  477 18471    70 

$CROLLCIGTS
    1     2     M 
  325 18508   185 

$CPIPE
    1     2     M 
  138 18683   197 

$CSNUS
    1     2     M 
  205 18624   189 

$CDISSOLV
    1     2     M 
   74 18758   186 

$CBIDIS
    1     2     M 
   71 18773   174 

$menthol
   .N    .S    .Z     1  NA's 
   79 15910    22  1617  1390 

$clove_spice
   .N    .S    .Z     1  NA's 
   79 15910    22    88  2919 

$fruit
   .N    .S    .Z     1  NA's 
   79 15910    22  1887  1120 

$chocolate
   .N    .S    .Z     1  NA's 
   79 15910    22   197  2810 

$alcoholic_drink
   .N    .S    .Z     1  NA's 
   79 15910    22   249  2758 

$candy_dessert_sweets
   .N    .S    .Z     1  NA's 
   79 15910    22  1108  1899 

$other
   .N    .S    .Z     1  NA's 
   79 15910    22   385  2622 

$no_use
missing 
  19018 
$psu
171990 172758 173174 173515 173535 173649 186909 187981 229278 243490 243700 
   271    305     68    337    186    204    133    345    380    480    114 
244840 258416 259834 274204 287241 300785 300814 303802 316013 358608 373709 
   160    146    134    264    134    316    331    249    367     41    433 
374512 374814 386930 387529 401006 401530 415984 416340 416550 417008 445315 
   191    268    422    362    279    170    282     92    133    218    247 
486486 487128 487177 487457 487518 501192 514427 515669 516003 516819 516849 
   286    305    312     91    167    189    125     84    268    145    227 
529165 529557 530666 531454 543901 559013 559459  58123 586535 601420 601577 
   219    104    140    267    304    267    313    291    150    286    328 
601913 602241 602677 674314 686520 688517 688727 688871 689471 689962 690649 
    24    384    112    126    165     51    136    137    199    147    236 
690720 693247 701384 729538 729920 732232  73728  73914 757899 758808 758911 
   146    117    203    138    100    164    167    171    298    146     92 
800237  86357  86380  86698  86869  86877  86997  87107  87479  87601  87669 
    60    205    262     94    178    346    220     71    222    184    198 
 87860  87876  88243 
   240    187    162 

$finwgt
298.94381695 1349.5698631 546.11348506 691.07608343 5285.5332095 456.58921394 
          35           34           33           33           33           30 
1814.6246166 676.96068381 745.55326355 876.04021216 1592.6392583 1162.7807537 
          30           29           29           29           29           28 
188.96218054 436.15905944 878.15523472 1110.4917206 305.78828093  316.2159641 
          27           27           27           27           26           26 
 511.1744348 646.15466161 690.19319279 1154.5213819 1159.6037522 1405.2169869 
          26           26           26           26           26           26 
674.64725539 825.52309574  884.6807423 925.71486779 1164.6450091  1362.316235 
          25           25           25           25           25           25 
558.25390758 625.53648288  839.6866944 882.78302229 886.20209942 1338.2350647 
          24           24           24           24           24           24 
1772.9717327 225.52526803 792.71025137 911.95033723 956.70266731 353.79114524 
          24           23           23           23           23           22 
507.50355235 739.96695295 775.05061994 887.67803637 1111.0008494 1194.6677527 
          22           22           22           22           22           22 
1278.4328612 1363.8639539 1642.2200913 11.150042919 16.065197906 172.15949442 
          22           22           22           21           21           21 
  414.949031 710.93532098 780.25920379 1023.8115393 1203.6836641 1444.3893222 
          21           21           21           21           21           21 
4411.7913281 178.47168745 566.73417786 631.63868903 670.49736758 728.77064723 
          21           20           20           20           20           20 
741.08110309 765.27178212 790.13593556 864.21130384 876.30041914 934.24093605 
          20           20           20           20           20           20 
1114.3023069  1179.018274 1232.8285309  1260.744969 1601.8637426 1756.8757857 
          20           20           20           20           20           20 
5183.3811612 5268.5549579 78.116704202 436.74312217 679.42299971 940.82420216 
          20           20           19           19           19           19 
963.51307711 1210.2995777 1366.7316106 1369.8132126 1403.0995315 1453.5670628 
          19           19           19           19           19           19 
 1952.421273 350.36503801 512.19207166 557.49460422 623.97616918 653.51170585 
          19           18           18           18           18           18 
697.41131479 751.91370328 799.96587077      (Other) 
          18           18           18        16757 

$stratum
 BR1  BR2  BR3  BR4  BU1  BU2  BU3  BU4  HR1  HR2  HR3  HR4  HU1  HU2  HU3  HU4 
2024  716  843  226 2664 1202  268  369 2958  714  665  688 2553 1001  917 1210 

$Age
 >18   10   11   12   13   14   15   16   17   18    9 NA's 
 122   19 1108 2789 3078 2810 2593 2523 2527 1376   35   38 

$female
FALSE  TRUE  NA's 
 9803  9099   116 

$Grade
            10             11             12              6              7 
          2499           2502           2306           2944           3024 
             8              9 Ungraded/Other           NA's 
          2869           2790             27             57 

$Not_HL
FALSE  TRUE 
 5900 13118 

$HL_Mex
FALSE  TRUE 
15958  3060 

$HL_PR
FALSE  TRUE 
18482   536 

$HL_Cub
FALSE  TRUE 
18805   213 

$HL_Other
FALSE  TRUE 
16877  2141 

$brand_ecig
    Blu    JUUL   Logic MarkTen    NJOY   Other    Vuse    NA's 
    111    2028      36      32      44    1253     100   15414 

$Race_AIAN
FALSE  TRUE 
17482  1536 

$Race_Asian
FALSE  TRUE 
17575  1443 

$Race_BAA
FALSE  TRUE 
15343  3675 

$Race_NHOPI
FALSE  TRUE 
18352   666 

$Race_White
FALSE  TRUE 
 6727 12291 

$ECIGT
FALSE  TRUE  NA's 
16061  2931    26 

$ECIGAR
FALSE  TRUE  NA's 
16441  2541    36 

$ESLT
FALSE  TRUE  NA's 
17704  1270    44 

$EELCIGT
FALSE  TRUE  NA's 
12563  6409    46 

$EHOOKAH
FALSE  TRUE  NA's 
17675  1289    54 

$EROLLCIGTS
FALSE  TRUE  NA's 
18005   832   181 

$EPIPE
FALSE  TRUE  NA's 
18336   489   193 

$ESNUS
FALSE  TRUE  NA's 
18209   616   193 

$EDISSOLV
FALSE  TRUE  NA's 
18583   244   191 

$EBIDIS
FALSE  TRUE  NA's 
18605   221   192 

$CCIGT
FALSE  TRUE  NA's 
18227   748    43 

$CCIGAR
FALSE  TRUE  NA's 
18028   930    60 

$CSLT
FALSE  TRUE  NA's 
18441   531    46 

$CELCIGT
FALSE  TRUE  NA's 
15286  3628   104 

$CHOOKAH
FALSE  TRUE  NA's 
18471   477    70 

$CROLLCIGTS
FALSE  TRUE  NA's 
18508   325   185 

$CPIPE
FALSE  TRUE  NA's 
18683   138   197 

$CSNUS
FALSE  TRUE  NA's 
18624   205   189 

$CDISSOLV
FALSE  TRUE  NA's 
18758    74   186 

$CBIDIS
FALSE  TRUE  NA's 
18773    71   174 

$menthol
FALSE  TRUE 
17401  1617 

$clove_spice
FALSE  TRUE 
18930    88 

$fruit
FALSE  TRUE 
17131  1887 

$chocolate
FALSE  TRUE 
18821   197 

$alcoholic_drink
FALSE  TRUE 
18769   249 

$candy_dessert_sweets
FALSE  TRUE 
17910  1108 

$other
FALSE  TRUE 
18633   385 

$no_use
FALSE 
19018 
                year                  psu               finwgt 
           "numeric"          "character"            "numeric" 
             stratum                  Age               female 
         "character"          "character"            "logical" 
               Grade               Not_HL               HL_Mex 
         "character"            "logical"            "logical" 
               HL_PR               HL_Cub             HL_Other 
           "logical"            "logical"            "logical" 
           Race_AIAN           Race_Asian             Race_BAA 
           "logical"            "logical"            "logical" 
          Race_NHOPI           Race_White                ECIGT 
           "logical"            "logical"            "logical" 
              ECIGAR                 ESLT              EELCIGT 
           "logical"            "logical"            "logical" 
          EROLLCIGTS               EBIDIS              EHOOKAH 
           "logical"            "logical"            "logical" 
               EPIPE                ESNUS             EDISSOLV 
           "logical"            "logical"            "logical" 
               CCIGT               CCIGAR                 CSLT 
           "logical"            "logical"            "logical" 
             CELCIGT           CROLLCIGTS               CBIDIS 
           "logical"            "logical"            "logical" 
             CHOOKAH                CPIPE                CSNUS 
           "logical"            "logical"            "logical" 
            CDISSOLV           brand_ecig              menthol 
           "logical"          "character"            "logical" 
         clove_spice                fruit            chocolate 
           "logical"            "logical"            "logical" 
     alcoholic_drink candy_dessert_sweets                other 
           "logical"            "logical"            "logical" 
              no_use 
           "logical" 
$year
 2015  2016  2017  2018  2019 
17711 20675 17872 20189 19018 

$psu
 187822  600815  373302  243490  086878  087664  173584  373427  458137  515814 
    565     531     501     480     479     470     469     463     452     450 
 087896  687909  374028  373709  386930  087843  188307  692424  572256  731503 
    437     436     435     433     422     421     421     421     417     414 
 601533  372861  087656  343702  736480  602241  188339  188841  229278  187681 
    406     401     397     394     394     384     383     382     380     379 
 530582  601983  173518  758261  758520  143354  416045  314736  188489  173483 
    379     374     373     373     373     372     371     370     369     368 
 190174  689327  316013  372465  316022  515990  087614  387529  014595  644656 
    368     368     367     367     364     364     363     362     354     354 
 529849  258711  344194  086754   86877  187981  245271  243742  514830  186117 
    352     350     348     347     346     345     345     344     344     341 
 173515  087425  300946  374456  529391  172374  300814  559658  572477  601577 
    337     336     336     336     333     331     331     331     328     328 
 644674  058470  314939  173458  387227  188207  245531  486665  674805  344472 
    328     325     323     322     322     320     320     320     320     319 
 087568  174258  486124  315841  373105  300785  074170  087174  015438  559459 
    318     318     318     317     317     316     314     314     313     313 
 730385  487177  559574  302266  400915  560847  087003  673286  144110 (Other) 
    313     312     312     309     309     309     308     308     307   59142 

$finwgt
6084.762382383 4990.707825052 6084.749363267  372.106445056  374.223712424 
            90             73             61             54             53 
 438.895059192  871.325553937  388.086140156  512.773737505 6084.748763328 
            53             52             51             50             50 
 471.940845283  390.583989416  393.890426751  405.380567077  641.647375466 
            49             48             48             48             48 
 472.183232467 1462.436434424 4990.707824997  593.037596627  895.030720016 
            47             47             46             45             44 
1294.137423906 1438.420759833  480.328096721  354.403367156  459.264157663 
            44             44             39             38             38 
 342.509547149  934.989137039 1836.652739308  460.564361052   702.57430816 
            37             37             37             36             36 
  298.94381695  645.096986799  688.756981919   724.56606859  794.117545838 
            35             35             35             35             35 
1784.368053098 4990.707825184  261.594994077  376.209171932  604.212351194 
            35             35             34             34             34 
  1349.5698631 6084.747889789  464.262746508  518.253252285   546.11348506 
            34             34             33             33             33 
 577.454052555   651.46204257   691.07608343  929.843069043  967.677487198 
            33             33             33             33             33 
  5285.5332095  452.180288822  541.333365673  729.816382606   787.40156861 
            33             32             32             32             32 
 835.705455892  888.382540193   927.94099198  321.964869964  348.981595173 
            32             32             32             31             31 
 473.352544161  526.352614715   688.65484377  851.768379729  868.130099018 
            31             31             31             31             31 
 894.645660874  903.144043691  984.845596021 1058.307376853  6505.08401827 
            31             31             31             31             31 
 243.614971982   456.58921394  550.786275093  565.667360783  666.989424614 
            30             30             30             30             30 
 701.063606043  716.756339454  759.980607023  793.263666402  855.933815842 
            30             30             30             30             30 
1133.236763357   1814.6246166  376.294559675  409.581862696  480.026932681 
            30             30             29             29             29 
  543.10044387  655.970957179   676.96068381   745.55326355  801.149846011 
            29             29             29             29             29 
 848.614920471   876.04021216  926.022139243  946.819967478 1015.462088582 
            29             29             29             29             29 
1016.149108108 1019.981866234 1040.468408082 1063.013428506        (Other) 
            29             29             29             29          91861 

$stratum
  BR1   BR2   BR3   BR4   BU1   BU2   BU3   BU4   HR1   HR2   HR3   HR4   HU1 
10080  5864  4798  2886  9212  4851  3221  2741 13570  2932  3025  2189  9732 
  HU2   HU3   HU4 
 7945  5548  6871 

$Age
  >18    10    11    12    13    14    15    16    17    18     9  NA's 
  727    50  5360 13499 14613 14036 13498 13205 12754  7108   198   417 

$female
FALSE  TRUE  NA's 
48149 46538   778 

$Grade
            10             11             12              6              7 
         13118          12857          12068          14158          14823 
             8              9 Ungraded/Other           NA's 
         14301          13561            102            477 

$Not_HL
FALSE  TRUE 
29372 66093 

$HL_Mex
FALSE  TRUE 
81323 14142 

$HL_PR
FALSE  TRUE 
92477  2988 

$HL_Cub
FALSE  TRUE 
94236  1229 

$HL_Other
FALSE  TRUE 
85451 10014 

$Race_AIAN
FALSE  TRUE 
88247  7218 

$Race_Asian
FALSE  TRUE 
88997  6468 

$Race_BAA
FALSE  TRUE 
75419 20046 

$Race_NHOPI
FALSE  TRUE 
92515  2950 

$Race_White
FALSE  TRUE 
37558 57907 

$ECIGT
FALSE  TRUE  NA's 
77584 17176   705 

$ECIGAR
FALSE  TRUE  NA's 
80549 13984   932 

$ESLT
FALSE  TRUE  NA's 
87950  6562   953 

$EELCIGT
FALSE  TRUE  NA's 
70229 24333   903 

$EROLLCIGTS
FALSE  TRUE  NA's 
89410  4436  1619 

$EBIDIS
FALSE  TRUE  NA's 
92679  1156  1630 

$EHOOKAH
FALSE  TRUE  NA's 
85617  8562  1286 

$EPIPE
FALSE  TRUE  NA's 
91658  2176  1631 

$ESNUS
FALSE  TRUE  NA's 
90689  3145  1631 

$EDISSOLV
FALSE  TRUE  NA's 
92733  1103  1629 

$CCIGT
FALSE  TRUE  NA's 
89668  4878   919 

$CCIGAR
FALSE  TRUE  NA's 
89312  5023  1130 

$CSLT
FALSE  TRUE  NA's 
91541  2796  1128 

$CELCIGT
FALSE  TRUE  NA's 
83510 11161   794 

$CROLLCIGTS
FALSE  TRUE  NA's 
91807  1976  1682 

$CBIDIS
FALSE  TRUE  NA's 
93323   471  1671 

$CHOOKAH
FALSE  TRUE  NA's 
90853  3142  1470 

$CPIPE
FALSE  TRUE  NA's 
92970   801  1694 

$CSNUS
FALSE  TRUE  NA's 
92565  1214  1686 

$CDISSOLV
FALSE  TRUE  NA's 
93305   477  1683 

$brand_ecig
    Blu    JUUL   Logic MarkTen    NJOY   Other    Vuse    NA's 
    111    2028      36      32      44    1253     100   91861 

$menthol
FALSE  TRUE  NA's 
73305  4449 17711 

$clove_spice
FALSE  TRUE  NA's 
77360   394 17711 

$fruit
FALSE  TRUE  NA's 
71945  5809 17711 

$chocolate
FALSE  TRUE  NA's 
76875   879 17711 

$alcoholic_drink
FALSE  TRUE  NA's 
76510  1244 17711 

$candy_dessert_sweets
FALSE  TRUE  NA's 
74188  3566 17711 

$other
FALSE  TRUE  NA's 
75675  2079 17711 

$no_use
FALSE  TRUE  NA's 
27851 49903 17711 

Reminder: Current users are a subset of ever users.

Data visualization

Question 3

What vaping brands and flavors appear to be used the most frequently?

Huang J, Duan Z, Kwok J, et al. Tob Control 2019;28:146–151.

Huang J, Duan Z, Kwok J, et al. Tob Control 2019;28:146–151.

Paper

plot5 <- nyts_data %>%
  filter(year!=2015) %>%
  filter(menthol==TRUE|
           clove_spice==TRUE|
           fruit==TRUE|
           chocolate==TRUE|
           alcoholic_drink==TRUE|
           candy_dessert_sweets==TRUE|
           other==TRUE) %>%
  mutate(ecig_sum_ever = select(., EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           ecig_sum_current = select(., CELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               select(.,-EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               select(.,-CELCIGT) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(ecig_ever = case_when(ecig_sum_ever > 0 ~ TRUE,
                                    ecig_sum_ever ==0 ~ FALSE),
           ecig_current = case_when(ecig_sum_current > 0 ~ TRUE,
                                    ecig_sum_current ==0 ~ FALSE),
           non_ecig_ever = case_when(non_ecig_sum_ever > 0 ~ TRUE,
                                    non_ecig_sum_ever ==0 ~ FALSE),
           non_ecig_current = case_when(non_ecig_sum_current > 0 ~ TRUE,
                                    non_ecig_sum_current ==0 ~ FALSE)) %>%
  mutate(ecig_only_ever = case_when(ecig_ever == TRUE &
                                      non_ecig_ever ==FALSE ~ TRUE,
                                    TRUE ~ FALSE),
           ecig_only_current = case_when(ecig_current == TRUE &
                                           non_ecig_ever ==FALSE ~ TRUE,
                                    TRUE ~ FALSE),
           non_ecig_only_ever = case_when(non_ecig_ever == TRUE &
                                            ecig_ever ==FALSE ~ TRUE,
                                    TRUE ~ FALSE),
           non_ecig_only_current = case_when(non_ecig_current == TRUE &
                                               ecig_ever ==FALSE ~ TRUE,
                                    TRUE ~ FALSE)) %>%
  mutate(Group = case_when(ecig_only_ever==TRUE |
                             ecig_only_current==TRUE ~ "Only e-cigarettes",
                         non_ecig_only_ever==TRUE |
                           non_ecig_only_current==TRUE ~ "Only other products",
                                    TRUE ~ "Both")) %>%
  filter(Group!="Both") %>%
  group_by(year, Group) %>%
  summarise(`Menthol`=(sum(menthol, na.rm = TRUE)*100)/
              sum(!is.na(menthol)),
              `Clove or Spice`=(sum(clove_spice, na.rm = TRUE)*100)/
              sum(!is.na(clove_spice)),
              `Fruit`=(sum(fruit, na.rm = TRUE)*100)/sum(!is.na(fruit)),
              `Chocolate`=(sum(chocolate, na.rm = TRUE)*100)/
              sum(!is.na(chocolate)),
              `Alcoholic Drink`=(sum(alcoholic_drink, na.rm = TRUE)*100)/
              sum(!is.na(alcoholic_drink)),
              `Candy/Desserts/Sweets`=(sum(candy_dessert_sweets, na.rm = TRUE)*100)/
              sum(!is.na(candy_dessert_sweets)),
            `Other`=(sum(other, na.rm = TRUE)*100)/
              sum(!is.na(other)),
            Respondents=n()) %>%
  #converting all columns between and including Menthol and Other to one column called Flavor
  pivot_longer(cols = Menthol:Other, names_to = "Flavor", values_to = "Percentage of students") %>%
  filter(!is.na(`Percentage of students`),
         Flavor!="Other") %>%
  group_by(Flavor) %>%
  mutate(affirmative=(Respondents * `Percentage of students`)/100) %>%
  mutate(flavor_mean = sum(affirmative)/sum(Respondents)) %>%
  ungroup() %>%
  mutate(flavor_mean_rank = dense_rank(flavor_mean),
         Flavor = fct_reorder(Flavor, flavor_mean_rank)) %>%
  ggplot(aes(x=year, y=`Percentage of students`, color=Group)) +
  facet_wrap(.~Flavor,ncol=3) +
  geom_line() + 
  geom_point(show.legend = FALSE) + 
  theme_minimal() +
  theme(legend.position = "bottom",
          axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90)) + 
  labs(title = "Among users of only one type of product, what vaping flavors appear to be used the most frequently?",
       subtitle = "Percent reporting only e-cigarette use vs only other nicotine product use")

plot5

Question 4

Have vaping rates possibly influenced tobacco/nicotine use?

plot7 <- nyts_data %>%
    mutate(ecig_sum_ever = select(., EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           ecig_sum_current = select(., CELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               select(.,-EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               select(.,-CELCIGT) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(ecig_ever = case_when(ecig_sum_ever > 0 ~ TRUE,
                                    ecig_sum_ever ==0 ~ FALSE),
           ecig_current = case_when(ecig_sum_current > 0 ~ TRUE,
                                    ecig_sum_current ==0 ~ FALSE),
           non_ecig_ever = case_when(non_ecig_sum_ever > 0 ~ TRUE,
                                    non_ecig_sum_ever ==0 ~ FALSE),
           non_ecig_current = case_when(non_ecig_sum_current > 0 ~ TRUE,
                                    non_ecig_sum_current ==0 ~ FALSE)) %>%
    group_by(year) %>%
    summarise(ecig_ever_year=(sum(ecig_ever, na.rm = TRUE)*100)/
                sum(!is.na(ecig_ever)),
              ecig_current_year=(sum(ecig_current, na.rm = TRUE)*100)/
                sum(!is.na(ecig_current)),
              non_ecig_ever_year=(sum(non_ecig_ever, na.rm = TRUE)*100)/
                sum(!is.na(non_ecig_ever)),
              non_ecig_current_year=(sum(non_ecig_current, na.rm = TRUE)*100)/
                sum(!is.na(non_ecig_current))) %>%
    pivot_longer(cols = -year, names_to = "Category", values_to = "Percentage of students") %>%
    mutate(User = case_when(Category =="ecig_ever_year" ~ "Ever",
                           Category =="non_ecig_ever_year" ~ "Ever",
                           Category =="ecig_current_year" ~ "Current",
                           Category =="non_ecig_current_year" ~ "Current")) %>%
    mutate(Product = case_when(Category =="ecig_ever_year" ~ "E-cigarettes",
                           Category =="non_ecig_ever_year" ~ "Other products",
                           Category =="ecig_current_year" ~ "E-cigarettes",
                           Category =="non_ecig_current_year" ~ "Other products")) %>%
    filter(User=="Ever") %>%
    ggplot(aes(x=year,y=`Percentage of students`, color=Product)) +
    geom_line(linetype=1) + # geom_bar(stat="identity", position = "dodge", color="black") +
  geom_point(show.legend = FALSE) +
  scale_y_continuous(breaks = seq(10, 60, by = 10), limits = c(10,60)) +
    theme_minimal() +
    theme(legend.position = "bottom",
          axis.title.x = element_blank()) +
    labs(title = "How does e-cigarette ever use compare to ever use of other products over the years?",
         subtitle = "E-cigarette and non-e-cigarette use",
         y = "% of students")

plot7

plot8 <- nyts_data %>%
    mutate(ecig_sum_ever = select(., EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           ecig_sum_current = select(., CELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               select(.,-EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               select(.,-CELCIGT) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(ecig_ever = case_when(ecig_sum_ever > 0 ~ TRUE,
                                    ecig_sum_ever ==0 ~ FALSE),
           ecig_current = case_when(ecig_sum_current > 0 ~ TRUE,
                                    ecig_sum_current ==0 ~ FALSE),
           non_ecig_ever = case_when(non_ecig_sum_ever > 0 ~ TRUE,
                                    non_ecig_sum_ever ==0 ~ FALSE),
           non_ecig_current = case_when(non_ecig_sum_current > 0 ~ TRUE,
                                    non_ecig_sum_current ==0 ~ FALSE)) %>%
    group_by(year) %>%
    summarise(ecig_ever_year=(sum(ecig_ever, na.rm = TRUE)*100)/
                sum(!is.na(ecig_ever)),
              ecig_current_year=(sum(ecig_current, na.rm = TRUE)*100)/
                sum(!is.na(ecig_current)),
              non_ecig_ever_year=(sum(non_ecig_ever, na.rm = TRUE)*100)/
                sum(!is.na(non_ecig_ever)),
              non_ecig_current_year=(sum(non_ecig_current, na.rm = TRUE)*100)/
                sum(!is.na(non_ecig_current))) %>%
    pivot_longer(cols = -year, names_to = "Category", values_to = "Percentage of students") %>%
    # gather(key=Category,
    #        value=`Percentage of students`,
    #        -year) %>%
    mutate(User = case_when(Category =="ecig_ever_year" ~ "Ever",
                           Category =="non_ecig_ever_year" ~ "Ever",
                           Category =="ecig_current_year" ~ "Current",
                           Category =="non_ecig_current_year" ~ "Current")) %>%
    mutate(Product = case_when(Category =="ecig_ever_year" ~ "E-cigarettes",
                           Category =="non_ecig_ever_year" ~ "Other products",
                           Category =="ecig_current_year" ~ "E-cigarettes",
                           Category =="non_ecig_current_year" ~ "Other products")) %>%
    ggplot(aes(x=year,y=`Percentage of students`, color=Product, linetype=User)) +
    geom_line() +
  geom_point(show.legend = FALSE) +
  scale_linetype_manual(values = c(2,1)) +
  scale_y_continuous(breaks = seq(0, 60, by = 10), limits = c(0,60)) +
    theme_minimal() +
    theme(legend.position = "bottom",
          axis.title.x = element_blank()) +
    labs(title = "How does e-cigarette use compare to use of other products over the years?",
         subtitle = "E-cigarette and non-e-cigarette use",
         y = "% of students")

plot8

Weighted Sample

plotA_w <- nyts_data %>%
    mutate(tobacco_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               apply(1, sum, na.rm=TRUE),
           tobacco_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(tobacco_ever = case_when(tobacco_sum_ever > 0 ~ TRUE,
                                    tobacco_sum_ever ==0 ~ FALSE),
           tobacco_current = case_when(tobacco_sum_current > 0 ~ TRUE,
                                    tobacco_sum_current ==0 ~ FALSE)) %>%
  as_survey_design(strata = stratum, ids = psu, weight  = finwgt, nest=TRUE) %>%
    group_by(year) %>%
  summarise(tobacco_ever_year = survey_mean(tobacco_ever, vartype = "ci", na.rm=TRUE),
            tobacco_current_year = survey_mean(tobacco_current, vartype = "ci", na.rm=TRUE))  %>%
  mutate_at(vars(-year), "*", 100) %>%
    pivot_longer(cols = -year, names_to = "Type", values_to = "Percentage of students") %>%
    # gather(key=Type,
    #        value=`Percentage of students`,
    #        -year) %>%
  mutate(Estimate = case_when(grepl("_low", Type) ~ "Lower",
                          grepl("_upp", Type) ~ "Upper",
                          TRUE ~ "Mean"),
         User = case_when(grepl("ever", Type) ~ "Ever",
                          grepl("current", Type) ~ "Current",
                          TRUE ~ "Mean")) %>%
  dplyr::select(-Type) %>%
#  pivot_wider_spec()
  spread(Estimate, `Percentage of students`) %>%
  ggplot(aes(x=year,y=Mean)) +
  geom_line(aes(linetype=User)) +
  geom_linerange(aes(ymin = Lower, ymax = Upper), show.legend = FALSE) +
  scale_linetype_manual(values = c(2,1)) +
    scale_y_continuous(breaks = seq(0,70,by=10),
                       labels = seq(0,70,by=10),
                       limits = c(0,70)) +
    theme_minimal() +
    theme(legend.position = "none",
          axis.title.x = element_blank()) +
    labs(title = "Nicotine product users more prevalent after 2017",
         y = "% of students")

plotB_w <- nyts_data %>%
    mutate(ecig_sum_ever = select(., EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           ecig_sum_current = select(., CELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               select(.,-EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               select(.,-CELCIGT) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(ecig_ever = case_when(ecig_sum_ever > 0 ~ TRUE,
                                    ecig_sum_ever ==0 ~ FALSE),
           ecig_current = case_when(ecig_sum_current > 0 ~ TRUE,
                                    ecig_sum_current ==0 ~ FALSE),
           non_ecig_ever = case_when(non_ecig_sum_ever > 0 ~ TRUE,
                                    non_ecig_sum_ever ==0 ~ FALSE),
           non_ecig_current = case_when(non_ecig_sum_current > 0 ~ TRUE,
                                    non_ecig_sum_current ==0 ~ FALSE)) %>%
  as_survey_design(strata = stratum, ids = psu, weight  = finwgt, nest=TRUE) %>%
    group_by(year) %>%
    summarise(ecig_ever_year = survey_mean(ecig_ever, vartype = "ci", na.rm=TRUE),
            ecig_current_year = survey_mean(ecig_current, vartype = "ci", na.rm=TRUE),
            non_ecig_ever_year = survey_mean(non_ecig_ever, vartype = "ci", na.rm=TRUE),
            non_ecig_current_year = survey_mean(non_ecig_current, vartype = "ci", na.rm=TRUE)) %>%
  mutate_at(vars(-year), "*", 100) %>%
  dplyr::select(year,
                ecig_ever_year,
                ecig_current_year,
                non_ecig_ever_year,
                non_ecig_current_year,
                contains("low"),
                contains("upp")) %>%
  pivot_longer(cols = -year, names_to = "Category", values_to = "Percentage of students") %>%
    # gather(key=Category,
    #        value=`Percentage of students`,
    #        -year)  %>%
  mutate(Estimate = case_when(grepl("_low", Category) ~ "Lower",
                          grepl("_upp", Category) ~ "Upper",
                          TRUE ~ "Mean"),
         User = case_when(grepl("current", Category) ~ "Current",
                          TRUE ~ "Ever",),
         Product = case_when(grepl("non_ecig", Category) ~ "Other products",
                          TRUE ~ "E-cigarettes")) %>%
  dplyr::select(-Category) %>%
  spread(Estimate, `Percentage of students`) %>%
  filter(User=="Ever") %>%
  dplyr::rename("Lower_temp" = Upper,
                "Upper_temp" = Lower) %>%
  dplyr::rename("Lower"=Lower_temp,
                "Upper"=Upper_temp) %>%
    ggplot(aes(x=year,y=Mean, color=Product)) +
  geom_line(linetype=1) +
  geom_linerange(aes(ymin = Lower, ymax = Upper), show.legend = FALSE) +
  scale_y_continuous(breaks = seq(10, 60, by = 10), limits = c(10,60)) +
    theme_minimal() +
    theme(legend.position = "none",
          axis.title.x = element_blank()) +
    labs(title = "% ever trying e-cigarettes increases &\n% ever trying other products decreases",
         y = "% of students")

#### the wrangling looks the same as the above plot...
plotC_w <- nyts_data %>%
    mutate(ecig_sum_ever = select(., EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           ecig_sum_current = select(., CELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               select(.,-EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               select(.,-CELCIGT) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(ecig_ever = case_when(ecig_sum_ever > 0 ~ TRUE,
                                    ecig_sum_ever ==0 ~ FALSE),
           ecig_current = case_when(ecig_sum_current > 0 ~ TRUE,
                                    ecig_sum_current ==0 ~ FALSE),
           non_ecig_ever = case_when(non_ecig_sum_ever > 0 ~ TRUE,
                                    non_ecig_sum_ever ==0 ~ FALSE),
           non_ecig_current = case_when(non_ecig_sum_current > 0 ~ TRUE,
                                    non_ecig_sum_current ==0 ~ FALSE)) %>%
  as_survey_design(strata = stratum, ids = psu, weight  = finwgt, nest=TRUE) %>%
    group_by(year) %>%
  summarise(ecig_ever_year = survey_mean(ecig_ever, vartype = "ci", na.rm=TRUE),
            ecig_current_year = survey_mean(ecig_current, vartype = "ci", na.rm=TRUE),
            non_ecig_ever_year = survey_mean(non_ecig_ever, vartype = "ci", na.rm=TRUE),
            non_ecig_current_year = survey_mean(non_ecig_current, vartype = "ci", na.rm=TRUE)) %>%
  mutate_at(vars(-year), "*", 100) %>%
  dplyr::select(year,
                ecig_ever_year,
                ecig_current_year,
                non_ecig_ever_year,
                non_ecig_current_year,
                contains("low"),
                contains("upp")) %>%
  pivot_longer(cols = -year, names_to = "Category", values_to = "Percentage of students") %>%
    # gather(key=Category,
    #        value=`Percentage of students`,
    #        -year) %>%
    mutate(Estimate = case_when(grepl("_low", Category) ~ "Lower",
                          grepl("_upp", Category) ~ "Upper",
                          TRUE ~ "Mean"),
         User = case_when(grepl("ever", Category) ~ "Ever",
                          grepl("current", Category) ~ "Current"),
         Product = case_when(grepl("non_ecig", Category) ~ "Other products",
                          TRUE ~ "E-cigarettes")) %>%
  dplyr::select(-Category) %>%
  spread(Estimate, `Percentage of students`) %>%
    ggplot(aes(x=year,y=Mean, color=Product)) +
  geom_line(aes(linetype=User)) +
  geom_linerange(aes(ymin = Lower, ymax = Upper), show.legend = FALSE) +
  scale_linetype_manual(values = c(2,1)) +
  scale_y_continuous(breaks = seq(0, 60, by = 10), limits = c(0,60)) +
    theme_minimal() +
    theme(legend.position = "none",
          axis.title.x = element_blank()) +
    labs(title = "% Using e-cigarettes increases &\n% using Other products decreases",
         y = "% of students")

title_w <- ggdraw() + 
  draw_label(
    expression("Have vaping rates possibly influenced tobacco/nicotine use?"),
    fontface = 'bold',
    size=14,
    x = 0,
    hjust = 0
  ) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

plotsA_w <- plot_grid(plotA_w,
                     rel_widths = c(1),
                     align = "v",
                     axis = "bt")
plotsBC_w <- plot_grid(plotB_w,
                     plotC_w,
                     rel_widths = c(1,1),
                     align = "v",
                     axis = "bt")

legend_w <- get_legend(plotB_w +
                       theme(legend.position = "bottom",
                             legend.direction = "horizontal"))

figure_w <- plot_grid(title_w,
                      plotsA_w,
                      plotsBC_w,
                      legend_w,
                      ncol = 1,
                      rel_heights = c(0.1,
                                      1,
                                      1,
                                      0.1),
                      scale = 1.0)

figure_w

Hypothethical Cohort

plotA_w_8 <- nyts_data %>%
  filter((Grade == "8" & year == 2015) |
         (Grade == "9" & year == 2016) |
         (Grade == "10" & year == 2017) |
         (Grade == "11" & year == 2018) |
          (Grade == "12" & year == 2019) 
         ) %>%
    mutate(tobacco_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               apply(1, sum, na.rm=TRUE),
           tobacco_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(tobacco_ever = case_when(tobacco_sum_ever > 0 ~ TRUE,
                                    tobacco_sum_ever ==0 ~ FALSE),
           tobacco_current = case_when(tobacco_sum_current > 0 ~ TRUE,
                                    tobacco_sum_current ==0 ~ FALSE)) %>%
  as_survey_design(strata = stratum, ids = psu, weight  = finwgt) %>%
    group_by(year) %>%
  summarise(tobacco_ever_year = survey_mean(tobacco_ever, vartype = "ci", na.rm=TRUE),
            tobacco_current_year = survey_mean(tobacco_current, vartype = "ci", na.rm=TRUE))  %>%
  mutate_at(vars(-year), "*", 100) %>%
    pivot_longer(cols = -year, names_to = "Type", values_to = "Percentage of students")%>%
    # gather(key=Type,
    #        value=`Percentage of students`,
    #        -year) %>%
  mutate(Estimate = case_when(grepl("_low", Type) ~ "Lower",
                          grepl("_upp", Type) ~ "Upper",
                          TRUE ~ "Mean"),
         User = case_when(grepl("ever", Type) ~ "Ever",
                          grepl("current", Type) ~ "Current",
                          TRUE ~ "Mean")) %>%
  dplyr::select(-Type) %>%
  spread(Estimate, `Percentage of students`) %>%
  ggplot(aes(x=year,y=Mean)) +
  geom_line(aes(linetype=User)) +
  geom_linerange(aes(ymin = Lower, ymax = Upper)) + 
  scale_linetype_manual(values = c(2,1)) +
    scale_y_continuous(breaks = seq(0,70,by=10),
                       labels = seq(0,70,by=10),
                       limits = c(0,70)) +
    theme_minimal() +
    theme(legend.position = "none",
          axis.title.x = element_blank()) +
    labs(title = "Nicotine product users becoming increasingly prevalent",
         y = "% of students")

plotB_w_8 <- nyts_data %>%
  filter((Grade == "8" & year == 2015) |
         (Grade == "9" & year == 2016) |
         (Grade == "10" & year == 2017) |
         (Grade == "11" & year == 2018) |
          (Grade == "12" & year == 2019) 
         ) %>%
    mutate(ecig_sum_ever = select(., EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           ecig_sum_current = select(., CELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               select(.,-EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               select(.,-CELCIGT) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(ecig_ever = case_when(ecig_sum_ever > 0 ~ TRUE,
                                    ecig_sum_ever ==0 ~ FALSE),
           ecig_current = case_when(ecig_sum_current > 0 ~ TRUE,
                                    ecig_sum_current ==0 ~ FALSE),
           non_ecig_ever = case_when(non_ecig_sum_ever > 0 ~ TRUE,
                                    non_ecig_sum_ever ==0 ~ FALSE),
           non_ecig_current = case_when(non_ecig_sum_current > 0 ~ TRUE,
                                    non_ecig_sum_current ==0 ~ FALSE)) %>%
  as_survey_design(strata = stratum, ids = psu, weight  = finwgt) %>%
    group_by(year) %>%
    summarise(ecig_ever_year = survey_mean(ecig_ever, vartype = "ci", na.rm=TRUE),
            ecig_current_year = survey_mean(ecig_current, vartype = "ci", na.rm=TRUE),
            non_ecig_ever_year = survey_mean(non_ecig_ever, vartype = "ci", na.rm=TRUE),
            non_ecig_current_year = survey_mean(non_ecig_current, vartype = "ci", na.rm=TRUE)) %>%
  mutate_at(vars(-year), "*", 100) %>%
  dplyr::select(year,
                ecig_ever_year,
                ecig_current_year,
                non_ecig_ever_year,
                non_ecig_current_year,
                contains("low"),
                contains("upp")) %>%
   pivot_longer(cols = -year, names_to = "Category", values_to = "Percentage of students")%>%
    # gather(key=Category,
    #        value=`Percentage of students`,
    #        -year)  %>%
  mutate(Estimate = case_when(grepl("_low", Category) ~ "Lower",
                          grepl("_upp", Category) ~ "Upper",
                          TRUE ~ "Mean"),
         User = case_when(grepl("current", Category) ~ "Current",
                          TRUE ~ "Ever",),
         Product = case_when(grepl("non_ecig", Category) ~ "Other products",
                          TRUE ~ "E-cigarettes")) %>%
  dplyr::select(-Category) %>%
  spread(Estimate, `Percentage of students`) %>%
  filter(User=="Ever") %>%
  dplyr::rename("Lower_temp" = Upper,
                "Upper_temp" = Lower) %>%
  dplyr::rename("Lower"=Lower_temp,
                "Upper"=Upper_temp) %>%
  ggplot(aes(x=year,y=Mean, color=Product)) +
  geom_line(linetype=1) +
  geom_linerange(aes(ymin = Lower, ymax = Upper)) + 
  scale_y_continuous(breaks = seq(10, 60, by = 10), limits = c(10,60)) +
    theme_minimal() +
    theme(legend.position = "none",
          axis.title.x = element_blank()) +
    labs(title = "% ever trying nicotine products increases",
         y = "% of students")

plotC_w_8 <- nyts_data %>%
  filter((Grade == "8" & year == 2015) |
         (Grade == "9" & year == 2016) |
         (Grade == "10" & year == 2017) |
         (Grade == "11" & year == 2018) |
          (Grade == "12" & year == 2019) 
         ) %>%
    mutate(ecig_sum_ever = select(., EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           ecig_sum_current = select(., CELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_ever = select(., starts_with("E", ignore.case = FALSE)) %>%
               select(.,-EELCIGT) %>%
               apply(1, sum, na.rm=TRUE),
           non_ecig_sum_current = select(., starts_with("C", ignore.case = FALSE)) %>%
               select(.,-CELCIGT) %>%
               apply(1, sum, na.rm=TRUE)) %>%
    mutate(ecig_ever = case_when(ecig_sum_ever > 0 ~ TRUE,
                                    ecig_sum_ever ==0 ~ FALSE),
           ecig_current = case_when(ecig_sum_current > 0 ~ TRUE,
                                    ecig_sum_current ==0 ~ FALSE),
           non_ecig_ever = case_when(non_ecig_sum_ever > 0 ~ TRUE,
                                    non_ecig_sum_ever ==0 ~ FALSE),
           non_ecig_current = case_when(non_ecig_sum_current > 0 ~ TRUE,
                                    non_ecig_sum_current ==0 ~ FALSE)) %>%
  as_survey_design(strata = stratum, ids = psu, weight  = finwgt) %>%
    group_by(year) %>%
  summarise(ecig_ever_year = survey_mean(ecig_ever, vartype = "ci", na.rm=TRUE),
            ecig_current_year = survey_mean(ecig_current, vartype = "ci", na.rm=TRUE),
            non_ecig_ever_year = survey_mean(non_ecig_ever, vartype = "ci", na.rm=TRUE),
            non_ecig_current_year = survey_mean(non_ecig_current, vartype = "ci", na.rm=TRUE)) %>%
  mutate_at(vars(-year), "*", 100) %>%
  dplyr::select(year,
                ecig_ever_year,
                ecig_current_year,
                non_ecig_ever_year,
                non_ecig_current_year,
                contains("low"),
                contains("upp")) %>%
  pivot_longer(cols = -year, names_to = "Category", values_to = "Percentage of students")%>%
    # gather(key=Category,
    #        value=`Percentage of students`,
    #        -year) %>%
    mutate(Estimate = case_when(grepl("_low", Category) ~ "Lower",
                          grepl("_upp", Category) ~ "Upper",
                          TRUE ~ "Mean"),
         User = case_when(grepl("ever", Category) ~ "Ever",
                          grepl("current", Category) ~ "Current"),
         Product = case_when(grepl("non_ecig", Category) ~ "Other products",
                          TRUE ~ "E-cigarettes")) %>%
  dplyr::select(-Category) %>%
  spread(Estimate, `Percentage of students`) %>%
    ggplot(aes(x=year,y=Mean, color=Product)) +
  geom_line(aes(linetype=User)) +
  geom_linerange(aes(ymin = Lower, ymax = Upper)) + 
  scale_linetype_manual(values = c(2,1)) +
  scale_y_continuous(breaks = seq(0, 60, by = 10), limits = c(0,60)) +
    theme_minimal() +
    theme(legend.position = "none",
          axis.title.x = element_blank()) +
    labs(title = "E-cigarette use surpasses use of other nicotine products",
         y = "% of students")

title_w_8 <- ggdraw() + 
  draw_label(
    expression("Among"~8^th~"graders in 2015, have vaping rates possibly influenced tobacco/nicotine use?"),
    fontface = 'bold',
    size=14,
    x = 0,
    hjust = 0
  ) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

plotsA_w_8 <- plot_grid(plotA_w_8,
                        rel_widths = c(1),
                        align = "v",
                        axis = "bt")

plotsBC_w_8 <- plot_grid(plotB_w_8,
                         plotC_w_8,
                         rel_widths = c(1,1),
                         axis = "bt")

legend_w_8 <- get_legend(plotB_w_8 +
                       theme(legend.position = "bottom",
                             legend.direction = "horizontal"))

figure_w_8 <- plot_grid(title_w_8,
                        plotsA_w_8,
                        plotsBC_w_8,
                        legend_w_8,
                        ncol = 1,
                        rel_heights = c(0.1,
                                      1,
                                      1,
                                      0.1),
                        scale = 1.0
)

figure_w_8

Final Figure

title_final <- ggdraw() +
  draw_label(
    expression("Have vaping rates possibly influenced tobacco/nicotine use?"),
    fontface = 'bold',
    size=16,
    x = 0.5) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

subtitle_uw_final <- ggdraw() + 
  draw_label(
    expression(~6^th~"-"~12^th~"graders, unweighted"),
    size=12,
    x = 0.5) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

subtitle_w_final <- ggdraw() + 
  draw_label(
    expression(~6^th~"-"~12^th~"graders, weighted"),
    fontface = 'bold',
    size=12,
    x = 0.5) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

subtitle_w_8_final <- ggdraw() + 
  draw_label(
    expression(~8^th~"graders in 2015, weighted"),
    fontface = 'bold',
    size=12,
    x = 0.5) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

subtitle_final <- plot_grid(subtitle_uw_final,
                            subtitle_w_final,
                            subtitle_w_8_final,
                            ncol = 3)

plotsA_title_final <- ggdraw() + 
  draw_label(
    expression("Prevalence of e-cigarette use by user type"),
    size=14,
    x = 0.5) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

plotsA_final <- plot_grid(plotA_uw + theme(plot.title = element_blank()),
                          plotA_w + theme(plot.title = element_blank()),
                          plotA_w_8 + theme(plot.title = element_blank()),
                          ncol = 3,
                          align = "v",
                          axis = "bt")

plotsB_title_final <- ggdraw() + 
  draw_label(
    expression("Prevalence of ever use by product type"),
    size=14,
    x = 0.5) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

plotsB_final <- plot_grid(plotB_uw + theme(plot.title = element_blank()),
                          plotB_w + theme(plot.title = element_blank()),
                          plotB_w_8 + theme(plot.title = element_blank()),
                          ncol = 3,
                          align = "v",
                          axis = "bt")

plotsC_title_final <- ggdraw() + 
  draw_label(
    expression("Prevalence of nicotine product use by product & user type"),
    size=14,
    x = 0.5) +
  theme(
    plot.margin = margin(0, 0, 0, 0)
  )

plotsC_final <- plot_grid(plotC_uw + theme(plot.title = element_blank()),
                          plotC_w + theme(plot.title = element_blank()),
                          plotC_w_8 + theme(plot.title = element_blank()),
                          ncol = 3,
                          align = "v",
                          axis = "bt")

legend_final <- get_legend(plotB_w +
                             theme(legend.position = "bottom",
                             legend.direction = "horizontal"))

final_plot <- plot_grid(title_final,
          plotsA_title_final,
          subtitle_final,
          plotsA_final,
          plotsB_title_final,
          subtitle_final,
          plotsB_final,
          plotsC_title_final,
          subtitle_final,
          plotsC_final,
          legend_final,
          ncol = 1,
          rel_heights = c(0.2,
                          0.2,
                          0.1,
                          1,
                          0.2,
                          0.1,
                          1,
                          0.2,
                          0.1,
                          1,
                          0.1))

final_plot

Homework questions

  • Apply survey weights to one of the figures produced in this case study in which weighted estimates were not produced. Include error bars in the updated figure.
    • Does the figure change after the application of survey weights?
    • If so, describe how.
  • Reproduce final_plot above for a different cohort of your choice.

Notes

Ever and current variables are limited to those shared by all years of data included in this case study.

New code: Knit time: 34.786 secs. Previous code: ~ 3 m.

Problems

I had difficulty producing a plot that succinctly presented a trend. It’s very easy to produce plots that are very useful once one is familiar with the data. Some plots, however, cannot stand alone and need additional context to be clear for those without prior knowledge of the data. When I first shared a plot I had been working on with others, it became clear that in my effort to present a complicated idea briefly I had left out information that would make the trend easily interpretable. To solve this issue, I began to present visualizations of the data alongside my original plot. The final figure I created contained several additional plots, each presenting the same trend at a different level than my initial plot.

My “centerpiece” plot is the middle plot in final_plot. The 8 plots around it help provide a very clear picture of what is going on in the US with regards to e-cigarette use and nicotine product use at large. On its own, it’s difficult to understand the trends in the US and how important the weighting scheme is for inference. Once you add the left and right columns, it’s clear what is going on.

LS0tCnRpdGxlOiAiT3BlbiBDYXNlIFN0dWRpZXMgOiBWYXBpbmcgQmVoYXZpb3JzIGluIEFtZXJpY2FuIFlvdXRoIgphdXRob3I6ICJNaWNoYWVsIE9udGl2ZXJvcywgQ2FycmllIFdyaWdodCwgUGhELiAiCgpjc3M6IHN0eWxlLmNzcwpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHNlbGZfY29udGFpbmVkOiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwoKLS0tCjxzdHlsZT4KI1RPQyB7CiAgYmFja2dyb3VuZDogdXJsKCJodHRwczovL29wZW5jYXNlc3R1ZGllcy5naXRodWIuaW8vaW1nL2xvZ28uanBnIik7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIHBhZGRpbmctdG9wOiAyNDBweCAhaW1wb3J0YW50OwogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KPC9zdHlsZT4KCmBgYHtyLCBlY2hvPUZBTFNFfQprbml0X3RpbWVfc3RhcnQgPC0gU3lzLnRpbWUoKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTgsIGRwaT0zMDApIApgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoaW5jbHVkZSA9IFRSVUUsIGNvbW1lbnQgPSBOQSwgZWNobyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAnOTAlJykKbGlicmFyeShoZXJlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCgojIyMjIHsub3V0bGluZSB9CmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI4MDAgcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiZmluYWxfcGxvdC5wbmciKSkKYGBgCiMjIyMKCgojIyB7LmRpc2NsYWltZXJfYmxvY2t9CgoqKkRpc2NsYWltZXIqKjogVGhlIHB1cnBvc2Ugb2YgdGhlIFtPcGVuIENhc2UgU3R1ZGllc10oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvKXt0YXJnZXQ9Il9ibGFuayJ9IHByb2plY3QgaXMgKip0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgZGF0YSBzY2llbmNlIG1ldGhvZHMsIHRvb2xzLCBhbmQgc29mdHdhcmUgaW4gdGhlIGNvbnRleHQgb2YgbWVzc3ksIHJlYWwtd29ybGQgZGF0YSoqLiBBIGdpdmVuIGNhc2Ugc3R1ZHkgZG9lcyBub3QgY292ZXIgYWxsIGFzcGVjdHMgb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MsIGlzIG5vdCBjbGFpbWluZyB0byBiZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3YXkgdG8gYW5hbHl6ZSBhIGdpdmVuIGRhdGEgc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIG1ha2luZyBwb2xpY3kgZGVjaXNpb25zIHdpdGhvdXQgZXh0ZXJuYWwgY29uc3VsdGF0aW9uIGZyb20gc2NpZW50aWZpYyBleHBlcnRzLiAKCiMjICoqTW90aXZhdGlvbioqCioqKiAKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpZYW5vc2t5LCBKLiBELiBldCBhbC4gU3BhdGlvLXRlbXBvcmFsIG1vZGVsaW5nIG9mIHBhcnRpY3VsYXRlIGFpciBwb2xsdXRpb24gaW4gdGhlIGNvbnRlcm1pbm91cyBVbml0ZWQgU3RhdGVzIHVzaW5nIGdlb2dyYXBoaWMgYW5kIG1ldGVvcm9sb2dpY2FsIHByZWRpY3RvcnMuICpFbnZpcm9uIEhlYWx0aCogMTMsIDYzICgyMDE0KS4KLSBbQXJ0aWNsZSBpbiBGcm9udGllcnMgb2YgUGhhcm1hY29sb2d5XShodHRwczovL3d3dy5mcm9udGllcnNpbi5vcmcvYXJ0aWNsZXMvMTAuMzM4OS9mcGhhci4yMDE5LjAxNjE5L2Z1bGwpCgotIFtNb3JiaWRpdHkgYW5kIE1vcnRhbGl0eSBXZWVrbHkgUmVwb3J0XShodHRwczovL3d3dy5jZGMuZ292L21td3Ivdm9sdW1lcy82OC93ci9tbTY4MDZlMS5odG0/c19jaWQ9bW02ODA2ZTFfdykKCi0gW1N0YXRpc3RhIFZpc3VhbGl6YXRpb25dKGh0dHBzOi8vd3d3LnN0YXRpc3RhLmNvbS9zdGF0aXN0aWNzLzg4MTgzNy92YXBpbmctYW5kLWVsZWN0cm9uaWMtY2lnYXJldHRlLXVzZS11cy1ieS1nZW5kZXIvKQoKCiMjIyMKCgojIyAqKk1haW4gUXVlc3Rpb25zKioKKioqIAoKIyMjIyB7Lm1haW5fcXVlc3Rpb25fYmxvY2t9CjxiPjx1PiBPdXIgbWFpbiBxdWVzdGlvbjogPC91PjwvYj4KCjEpIEhvdyBoYXMgdG9iYWNjby9uaWNvdGluZSB1c2UgYnkgQW1lcmljYW4geW91dGggY2hhbmdlZCBzaW5jZSAyMDE1PyAKMikgSG93IGRvIHZhcGluZyByYXRlcyBjb21wYXJlIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXM/CjMpIFdoYXQgdmFwaW5nIGJyYW5kcyBhbmQgZmxhdm9ycyBhcHBlYXIgdG8gYmUgdXNlZCB0aGUgbW9zdCBmcmVxdWVudGx5PwogICAgKyBEdXJpbmcgdGhlIHBhc3QgMzAgZGF5cywgd2hhdCBicmFuZCBvZiBlLWNpZ2FyZXR0ZXMgZGlkIHlvdSB1c3VhbGx5IHVzZT8KNCkgSGF2ZSB2YXBpbmcgcmF0ZXMgcG9zc2libHkgaW5mbHVlbmNlZCB0b2JhY2NvL25pY290aW5lIHVzZT8KCiMjIyMKCgojIyAqKkxlYXJuaW5nIE9iamVjdGl2ZXMqKiAKKioqIAoKSW4gdGhpcyBjYXNlIHN0dWR5LCB3ZSB3aWxsIGNvdmVyIGhvdyB0byBtYWtlIGEgdmFyaWV0eSBvZiB2aXN1YWxpemF0aW9ucyB0byBjb21wYXJlIG11bHRpcGxlIGdyb3VwcyBhY3Jvc3MgdGltZS4gV2Ugd2lsbCBhbHNvIGRlbW9uc3RyYXRlIGhvdyB0byB3b3JrIHdpdGggY29kZWJvb2tzLiBXZSB3aWxsIGNvdmVyIHRoZSBjb25jZXB0IG9mIHN1cnZleSB3ZWlnaHRpbmcgYW5kIGludHJvZHVjZSB0aGUgYHNydnlyYCBwYWNrYWdlLiBXZSB3aWxsIGRpc2N1c3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwb29sZWQgY3Jvc3Mtc2VjdGlvbmFsIGRhdGEgYW5kIHBhbmVsIGRhdGEuIFdlIHdpbGwgZXNwZWNpYWxseSBmb2N1cyBvbiB1c2luZyBwYWNrYWdlcyBhbmQgZnVuY3Rpb25zIGZyb20gdGhlIFtgVGlkeXZlcnNlYF0oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gZm9yIHdyYW5nbGluZyBkYXRhLCBzdWNoIGFzIGBkcHlyYCBhbmQgZm9yIHZpc3VhbGl6YXRpb24sIHN1Y2hhcyBhcyBgZ2dwbG90MmAuIFRoZSB0aWR5dmVyc2UgaXMgYSBsaWJyYXJ5IG9mIHBhY2thZ2VzIGNyZWF0ZWQgYnkgUlN0dWRpby4gV2hpbGUgc29tZSBzdHVkZW50cyBtYXkgYmUgZmFtaWxpYXIgd2l0aCBwcmV2aW91cyBSIHByb2dyYW1taW5nIHBhY2thZ2VzLCB0aGVzZSBwYWNrYWdlcyBtYWtlIGRhdGEgc2NpZW5jZSBpbiBSIGVzcGVjaWFsbHkgZWZmaWNpZW50LgoKCmBgYHtyLCBvdXQud2lkdGggPSAiMjAlIiwgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ24gPSJjZW50ZXIifQoKaW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly90aWR5dmVyc2UudGlkeXZlcnNlLm9yZy9sb2dvLnBuZyIpCmBgYAoKCioqKiAKCgpXZSB3aWxsIGJlZ2luIGJ5IGxvYWRpbmcgdGhlIHBhY2thZ2VzIHRoYXQgd2Ugd2lsbCBuZWVkOgoKCgoKYGBge3J9CmxpYnJhcnkoaGVyZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShyZWFkcikKbGlicmFyeShzcnZ5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkoY293cGxvdCkKYGBgCgojIyBTZXNzaW9uIGluZm8KCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoKIyBEYXRhIGltcG9ydAoKIyMgRGF0YXNldHMKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQp0YmwgPC0gbGlzdC5maWxlcyhoZXJlOjpoZXJlKCksIHJlY3Vyc2l2ZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiKi54bHN4IikgJT4lIAogIG1hcCh+cmVhZF9leGNlbCguKSkKCnRibF9uYW1lcyA8LSBsaXN0LmZpbGVzKGhlcmU6OmhlcmUoIiIpLCByZWN1cnNpdmUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIioueGxzeCIpICU+JQogIHN0cl9leHRyYWN0KCJueXRzWzJdWzBdWzFdWzUtOV0iKQoKbmFtZXModGJsKSA8LSB0YmxfbmFtZXMKCnRibFtbIm55dHMyMDE1Il1dIDwtIHRibFtbIm55dHMyMDE1Il1dICU+JQogICAgZHBseXI6OnNlbGVjdChwc3UsCiAgICAgICAgICAgICAgICAgIGZpbndndCwKICAgICAgICAgICAgICAgICAgc3RyYXR1bSwKICAgICAgICAgICAgICAgICAgUW4xLCAjQWdlCiAgICAgICAgICAgICAgICAgIFFuMiwgI1NleAogICAgICAgICAgICAgICAgICBRbjMsICNHcmFkZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUW40IiksICNIaXNwYW5pYy9MYXRpbm8KICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlFuNSIpLCAjUmFjZSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgRUZMQVZDSUdUUywKICAgICAgICAgICAgICAgICAgQ0ZMQVZDSUdUUywKICAgICAgICAgICAgICAgICAgRUZMQVZDSUdBUiwKICAgICAgICAgICAgICAgICAgKQoKdGJsW1sibnl0czIwMTYiXV0gPC0gdGJsW1sibnl0czIwMTYiXV0gJT4lCiAgICBkcGx5cjo6c2VsZWN0KHBzdSwKICAgICAgICAgICAgICAgICAgZmlud2d0LAogICAgICAgICAgICAgICAgICBzdHJhdHVtLAogICAgICAgICAgICAgICAgICBRMSwgI0FnZQogICAgICAgICAgICAgICAgICBRMiwgI1NleAogICAgICAgICAgICAgICAgICBRMywgI0dyYWRlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNSIpLCAjUmFjZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBFRkxBVkNJR0FSLAogICAgICAgICAgICAgICAgICBRNTBBLCAjTWVudGhvbCAjIFdoYXQgZmxhdm9ycyBvZiB0b2JhY2NvIHByb2R1Y3RzIGhhdmUgeW91IHVzZWQgaW4gdGhlIHBhc3QgMzAgZGF5cz8gKFNlbGVjdCBvbmUgb3IgbW9yZSkKICAgICAgICAgICAgICAgICAgUTUwQiwgI0Nsb3ZlIG9yIHNwaWNlCiAgICAgICAgICAgICAgICAgIFE1MEMsICNGcnVpdAogICAgICAgICAgICAgICAgICBRNTBELCAjQ2hvY29sYXRlCiAgICAgICAgICAgICAgICAgIFE1MEUsICNBbGNvaG9saWMgRHJpbmsKICAgICAgICAgICAgICAgICAgUTUwRiwgI0NhbmR5L0Rlc3NlcnRzL090aGVyIFN3ZWV0cwogICAgICAgICAgICAgICAgICBRNTBHLCAjU29tZSBPdGhlciBGbGF2b3IgTm90IExpc3RlZCBIZXJlCiAgICAgICAgICAgICAgICAgIFE1MEggI0kgRGlkIE5vdCBVc2UgRmxhdm9yZWQgVG9iYWNjbyBQcm9kdWN0cyBJbiB0aGUgUGFzdAogICAgICAgICAgICAgICAgICApIAoKdGJsW1sibnl0czIwMTciXV0gPC0gdGJsW1sibnl0czIwMTciXV0gJT4lCiAgICBkcGx5cjo6c2VsZWN0KHBzdSwKICAgICAgICAgICAgICAgICAgZmlud2d0LAogICAgICAgICAgICAgICAgICBzdHJhdHVtLAogICAgICAgICAgICAgICAgICBRMSwgI0FnZQogICAgICAgICAgICAgICAgICBRMiwgI1NleAogICAgICAgICAgICAgICAgICBRMywgI0dyYWRlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNSIpLCAjUmFjZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBDQklESVMsCiAgICAgICAgICAgICAgICAgIFE1MEEsICNNZW50aG9sICMgV2hhdCBmbGF2b3JzIG9mIHRvYmFjY28gcHJvZHVjdHMgaGF2ZSB5b3UgdXNlZCBpbiB0aGUgcGFzdCAzMCBkYXlzPyAoU2VsZWN0IG9uZSBvciBtb3JlKQogICAgICAgICAgICAgICAgICBRNTBCLCAjQ2xvdmUgb3Igc3BpY2UKICAgICAgICAgICAgICAgICAgUTUwQywgI0ZydWl0CiAgICAgICAgICAgICAgICAgIFE1MEQsICNDaG9jb2xhdGUKICAgICAgICAgICAgICAgICAgUTUwRSwgI0FsY29ob2xpYyBEcmluawogICAgICAgICAgICAgICAgICBRNTBGLCAjQ2FuZHkvRGVzc2VydHMvT3RoZXIgU3dlZXRzCiAgICAgICAgICAgICAgICAgIFE1MEcsICNTb21lIE90aGVyIEZsYXZvciBOb3QgTGlzdGVkIEhlcmUKICAgICAgICAgICAgICAgICAgUTUwSCAjSSBEaWQgTm90IFVzZSBGbGF2b3JlZCBUb2JhY2NvIFByb2R1Y3RzIEluIHRoZSBQYXN0CiAgICAgICAgICAgICAgICAgICkKCnRibFtbIm55dHMyMDE4Il1dIDwtIHRibFtbIm55dHMyMDE4Il1dICU+JQogICAgZHBseXI6OnNlbGVjdChwc3UsCiAgICAgICAgICAgICAgICAgIGZpbndndCwKICAgICAgICAgICAgICAgICAgc3RyYXR1bSwKICAgICAgICAgICAgICAgICAgUTEsICNBZ2UKICAgICAgICAgICAgICAgICAgUTIsICNTZXgKICAgICAgICAgICAgICAgICAgUTMsICNHcmFkZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUTQiKSwgI0hpc3BhbmljL0xhdGlubwogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUTUiKSwgI1JhY2UKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgUTUwQSwgI01lbnRob2wgIyBXaGF0IGZsYXZvcnMgb2YgdG9iYWNjbyBwcm9kdWN0cyBoYXZlIHlvdSB1c2VkIGluIHRoZSBwYXN0IDMwIGRheXM/IChTZWxlY3Qgb25lIG9yIG1vcmUpCiAgICAgICAgICAgICAgICAgIFE1MEIsICNDbG92ZSBvciBzcGljZQogICAgICAgICAgICAgICAgICBRNTBDLCAjRnJ1aXQKICAgICAgICAgICAgICAgICAgUTUwRCwgI0Nob2NvbGF0ZQogICAgICAgICAgICAgICAgICBRNTBFLCAjQWxjb2hvbGljIERyaW5rCiAgICAgICAgICAgICAgICAgIFE1MEYsICNDYW5keS9EZXNzZXJ0cy9PdGhlciBTd2VldHMKICAgICAgICAgICAgICAgICAgUTUwRywgI1NvbWUgT3RoZXIgRmxhdm9yIE5vdCBMaXN0ZWQgSGVyZQogICAgICAgICAgICAgICAgICBRNTBIICNJIERpZCBOb3QgVXNlIEZsYXZvcmVkIFRvYmFjY28gUHJvZHVjdHMgSW4gdGhlIFBhc3QKICAgICAgICAgICAgICAgICAgKQoKdGJsW1sibnl0czIwMTkiXV0gPC0gdGJsW1sibnl0czIwMTkiXV0gJT4lCiAgICBkcGx5cjo6c2VsZWN0KHBzdSwKICAgICAgICAgICAgICAgICAgZmlud2d0LAogICAgICAgICAgICAgICAgICBzdHJhdHVtLAogICAgICAgICAgICAgICAgICBRMSwgI0FnZQogICAgICAgICAgICAgICAgICBRMiwgI1NleAogICAgICAgICAgICAgICAgICBRMywgI0dyYWRlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNSIpLCAjUmFjZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBFSFRQLAogICAgICAgICAgICAgICAgICBDSFRQLAogICAgICAgICAgICAgICAgICBRNDAsICNCcmFuZywgZS1jaWdhcmV0dGVzCiAgICAgICAgICAgICAgICAgIFE2MkEsICNNZW50aG9sICMgV2hhdCBmbGF2b3JzIG9mIHRvYmFjY28gcHJvZHVjdHMgaGF2ZSB5b3UgdXNlZCBpbiB0aGUgcGFzdCAzMCBkYXlzPyAoU2VsZWN0IG9uZSBvciBtb3JlKQogICAgICAgICAgICAgICAgICBRNjJCLCAjQ2xvdmUgb3Igc3BpY2UKICAgICAgICAgICAgICAgICAgUTYyQywgI0ZydWl0IAogICAgICAgICAgICAgICAgICBRNjJELCAjQ2hvY29sYXRlCiAgICAgICAgICAgICAgICAgIFE2MkUsICNBbGNvaG9saWMgRHJpbmsKICAgICAgICAgICAgICAgICAgUTYyRiwgI0NhbmR5L0Rlc3NlcnRzL090aGVyIFN3ZWV0cwogICAgICAgICAgICAgICAgICBRNjJHLCAjU29tZSBPdGhlciBGbGF2b3IgTm90IExpc3RlZCBIZXJlIAogICAgICAgICAgICAgICAgICApCgpkaXIuY3JlYXRlKCJkYXRhX3JlZHVjZWQiLAogICAgICAgICAgIHNob3dXYXJuaW5ncyA9IEZBTFNFKQoKbWFwcGx5KHdyaXRlX2NzdiwgdGJsLCBwYXRoPXBhc3RlMCgiZG9jcy9kYXRhX3JlZHVjZWQvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyh0YmwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuY3N2JykKICAgICAgICkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0Kc3RhcnRfdGltZSA8LSBTeXMudGltZSgpCmNzdnMgPC0gbGlzdC5maWxlcyhyZWN1cnNpdmUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIqLmNzdiIpICU+JSAKICBtYXAofnJlYWRfY3N2KC4pKQplbmRfdGltZSA8LSBTeXMudGltZSgpCgp0ZXN0X3RpbWUgPC0gZW5kX3RpbWUgLSBzdGFydF90aW1lCgp0aW1lX21lc3NhZ2UgPC0gcGFzdGUoIkR1cmF0aW9uIG9mIGRhdGEgaW1wb3J0OiIsCiAgICAgIHJvdW5kKGFzLm51bWVyaWModGVzdF90aW1lKSAsMyksCiAgICAgIHVuaXRzKHRlc3RfdGltZSkKICAgICAgKQoKY3N2c19uYW1lcyA8LSBsaXN0LmZpbGVzKHJlY3Vyc2l2ZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIiouY3N2IikgJT4lCiAgc3RyX2V4dHJhY3QoIm55dHNbMl1bMF1bMV1bNS05XSIpCgpuYW1lcyhjc3ZzKSA8LSBjc3ZzX25hbWVzCgpueXRzX2RhdGEgPC0gY3N2cwpybShjc3ZzKQpybShjc3ZzX25hbWVzKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQpueXRzX2RhdGEgPC0gbGlzdC5maWxlcyhyZWN1cnNpdmUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIqLnhsc3giKSAlPiUgCiAgbWFwKH5yZWFkX2V4Y2VsKC4pKQoKbnl0c19kYXRhX25hbWVzIDwtIGxpc3QuZmlsZXMocmVjdXJzaXZlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiKi54bHN4IikgJT4lCiAgc3RyX2V4dHJhY3QoIm55dHNbMl1bMF1bMV1bNS05XSIpCgpuYW1lcyhueXRzX2RhdGEpIDwtIG55dHNfZGF0YV9uYW1lcwoKbmFtZXMobnl0c19kYXRhKQpgYGAKCiMgRGF0YSB3cmFuZ2xpbmcKCmBgYHtyfQpueXRzX2RhdGFbWyJueXRzMjAxNSJdXSA8LSBueXRzX2RhdGFbWyJueXRzMjAxNSJdXSAlPiUKICAgIGRwbHlyOjpzZWxlY3QocHN1LAogICAgICAgICAgICAgICAgICBmaW53Z3QsCiAgICAgICAgICAgICAgICAgIHN0cmF0dW0sCiAgICAgICAgICAgICAgICAgIFFuMSwgI0FnZQogICAgICAgICAgICAgICAgICBRbjIsICNTZXgKICAgICAgICAgICAgICAgICAgUW4zLCAjR3JhZGUKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlFuNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRbjUiKSwgI1JhY2UKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgLUVGTEFWQ0lHVFMsCiAgICAgICAgICAgICAgICAgIC1DRkxBVkNJR1RTLAogICAgICAgICAgICAgICAgICAtRUZMQVZDSUdBUiwKICAgICAgICAgICAgICAgICAgKSAlPiUKICAgIHJlbmFtZShBZ2U9UW4xLAogICAgICAgICAgIGZlbWFsZT1RbjIsCiAgICAgICAgICAgR3JhZGU9UW4zLAogICAgICAgICAgIE5vdF9ITD1RbjRhLAogICAgICAgICAgIEhMX01leD1RbjRiLAogICAgICAgICAgIEhMX1BSPVFuNGMsCiAgICAgICAgICAgSExfQ3ViPVFuNGQsCiAgICAgICAgICAgSExfT3RoZXI9UW40ZSwKICAgICAgICAgICBSYWNlX0FJQU49UW41YSwKICAgICAgICAgICBSYWNlX0FzaWFuPVFuNWIsCiAgICAgICAgICAgUmFjZV9CQUE9UW41YywKICAgICAgICAgICBSYWNlX05IT1BJPVFuNWQsCiAgICAgICAgICAgUmFjZV9XaGl0ZT1RbjVlKSAlPiUKICAgIG11dGF0ZShBZ2U9QWdlKzgsCiAgICAgICAgICAgR3JhZGU9R3JhZGUrNSwKICAgICAgICAgICBicmFuZF9lY2lnPU5BLAogICAgICAgICAgIG1lbnRob2w9TkEsCiAgICAgICAgICAgY2xvdmVfc3BpY2U9TkEsCiAgICAgICAgICAgZnJ1aXQ9TkEsCiAgICAgICAgICAgY2hvY29sYXRlPU5BLAogICAgICAgICAgIGFsY29ob2xpY19kcmluaz1OQSwKICAgICAgICAgICBjYW5keV9kZXNzZXJ0X3N3ZWV0cz1OQSwKICAgICAgICAgICBvdGhlcj1OQSwKICAgICAgICAgICBub191c2U9TkEpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJRIikpCmBgYAoKYGBge3J9CnNhcHBseShueXRzX2RhdGFbWyJueXRzMjAxNSJdXSwgZnVuY3Rpb24oeCkKICAgIHN1bW1hcnkoCiAgICAgICAgZmFjdG9yKHgpCiAgICAgICAgKQogICAgKQpgYGAKCmBgYHtyfQojTm90ZSBhYm91dCBkaWZmZXJlbmNlIGJldHdlZW4gcmVjb2RlIGFuZCBmY3RfcmVjb2RlCm55dHNfZGF0YVtbIm55dHMyMDE1Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE1Il1dICU+JQogIG11dGF0ZV9hbGwofiByZXBsYWNlKC4sIC4gJWluJSBjKCIuIiksIE5BKSkgJT4lCiAgbXV0YXRlKEFnZT1hcy5jaGFyYWN0ZXIoQWdlKSwKICAgICAgICAgR3JhZGU9YXMuY2hhcmFjdGVyKEdyYWRlKQogICAgICAgICApICU+JQogIG11dGF0ZShBZ2U9cmVjb2RlKEFnZSwKICAgICAgICAgICAgICAgICAgICBgMTlgID0gIj4xOCIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgZmVtYWxlPXJlY29kZShmZW1hbGUsCiAgICAgICAgICAgICAgICAgICAgICBgMWA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgYDJgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IE5BLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBOQSkpKQpgYGAKCmBgYHtyfQpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTUiXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKYGBgCgpgYGB7cn0Kbnl0c19kYXRhW1sibnl0czIwMTYiXV0gPC0gbnl0c19kYXRhW1sibnl0czIwMTYiXV0gJT4lCiAgICBkcGx5cjo6c2VsZWN0KHBzdSwKICAgICAgICAgICAgICAgICAgZmlud2d0LAogICAgICAgICAgICAgICAgICBzdHJhdHVtLAogICAgICAgICAgICAgICAgICBRMSwgI0FnZQogICAgICAgICAgICAgICAgICBRMiwgI1NleAogICAgICAgICAgICAgICAgICBRMywgI0dyYWRlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNSIpLCAjUmFjZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAtRUZMQVZDSUdBUiwKICAgICAgICAgICAgICAgICAgUTUwQSwgI01lbnRob2wgIyBXaGF0IGZsYXZvcnMgb2YgdG9iYWNjbyBwcm9kdWN0cyBoYXZlIHlvdSB1c2VkIGluIHRoZSBwYXN0IDMwIGRheXM/IChTZWxlY3Qgb25lIG9yIG1vcmUpCiAgICAgICAgICAgICAgICAgIFE1MEIsICNDbG92ZSBvciBzcGljZQogICAgICAgICAgICAgICAgICBRNTBDLCAjRnJ1aXQKICAgICAgICAgICAgICAgICAgUTUwRCwgI0Nob2NvbGF0ZQogICAgICAgICAgICAgICAgICBRNTBFLCAjQWxjb2hvbGljIERyaW5rCiAgICAgICAgICAgICAgICAgIFE1MEYsICNDYW5keS9EZXNzZXJ0cy9PdGhlciBTd2VldHMKICAgICAgICAgICAgICAgICAgUTUwRywgI1NvbWUgT3RoZXIgRmxhdm9yIE5vdCBMaXN0ZWQgSGVyZQogICAgICAgICAgICAgICAgICBRNTBIICNJIERpZCBOb3QgVXNlIEZsYXZvcmVkIFRvYmFjY28gUHJvZHVjdHMgSW4gdGhlIFBhc3QKICAgICAgICAgICAgICAgICAgKSAlPiUKICAgIHJlbmFtZShBZ2U9UTEsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIEdyYWRlPVEzLAogICAgICAgICAgIE5vdF9ITD1RNEEsCiAgICAgICAgICAgSExfTWV4PVE0QiwKICAgICAgICAgICBITF9QUj1RNEMsCiAgICAgICAgICAgSExfQ3ViPVE0RCwKICAgICAgICAgICBITF9PdGhlcj1RNEUsCiAgICAgICAgICAgUmFjZV9BSUFOPVE1QSwKICAgICAgICAgICBSYWNlX0FzaWFuPVE1QiwKICAgICAgICAgICBSYWNlX0JBQT1RNUMsCiAgICAgICAgICAgUmFjZV9OSE9QST1RNUQsCiAgICAgICAgICAgUmFjZV9XaGl0ZT1RNUUsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIG1lbnRob2w9UTUwQSwKICAgICAgICAgICBjbG92ZV9zcGljZT1RNTBCLAogICAgICAgICAgIGZydWl0PVE1MEMsCiAgICAgICAgICAgY2hvY29sYXRlPVE1MEQsCiAgICAgICAgICAgYWxjb2hvbGljX2RyaW5rPVE1MEUsCiAgICAgICAgICAgY2FuZHlfZGVzc2VydF9zd2VldHM9UTUwRiwKICAgICAgICAgICBvdGhlcj1RNTBHLAogICAgICAgICAgIG5vX3VzZT1RNTBIKSAlPiUKICAgIG11dGF0ZShBZ2UgPSBhcy5udW1lcmljKEFnZSkgKyA4LAogICAgICAgICAgIEdyYWRlID0gYXMubnVtZXJpYyhHcmFkZSkgKyA1LAogICAgICAgICAgIGJyYW5kX2VjaWc9TkEpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJRIikpCgpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTYiXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKCm55dHNfZGF0YVtbIm55dHMyMDE2Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE2Il1dICU+JQogIG11dGF0ZV9hbGwofiByZXBsYWNlKC4sIC4gJWluJSBjKCIqIiwgIioqIiksIE5BKSkgJT4lCiAgbXV0YXRlKEFnZT1hcy5jaGFyYWN0ZXIoQWdlKSwKICAgICAgICAgR3JhZGU9YXMuY2hhcmFjdGVyKEdyYWRlKQogICAgICAgICApICU+JQogIG11dGF0ZShBZ2U9cmVjb2RlKEFnZSwKICAgICAgICAgICAgICAgICAgICBgMTlgID0gIj4xOCIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgZmVtYWxlPXJlY29kZShmZW1hbGUsCiAgICAgICAgICAgICAgICAgICAgICBgMWA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgYDJgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJFIiwgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSwKICAgICAgICAgICAgICBsaXN0KH5yZWNvZGUoLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgICBtdXRhdGVfYXQodmFycyhtZW50aG9sOm5vX3VzZSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkKCnNhcHBseShueXRzX2RhdGFbWyJueXRzMjAxNiJdXSwgZnVuY3Rpb24oeCkKICAgIHN1bW1hcnkoCiAgICAgICAgZmFjdG9yKHgpCiAgICAgICAgKQogICAgKQpgYGAKCmBgYHtyfQpueXRzX2RhdGFbWyJueXRzMjAxNyJdXSA8LSBueXRzX2RhdGFbWyJueXRzMjAxNyJdXSAlPiUKICAgIGRwbHlyOjpzZWxlY3QocHN1LAogICAgICAgICAgICAgICAgICBmaW53Z3QsCiAgICAgICAgICAgICAgICAgIHN0cmF0dW0sCiAgICAgICAgICAgICAgICAgIFExLCAjQWdlCiAgICAgICAgICAgICAgICAgIFEyLCAjU2V4CiAgICAgICAgICAgICAgICAgIFEzLCAjR3JhZGUKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlE0IiksICNIaXNwYW5pYy9MYXRpbm8KICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlE1IiksICNSYWNlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgIENCSURJUywKICAgICAgICAgICAgICAgICAgUTUwQSwgI01lbnRob2wgIyBXaGF0IGZsYXZvcnMgb2YgdG9iYWNjbyBwcm9kdWN0cyBoYXZlIHlvdSB1c2VkIGluIHRoZSBwYXN0IDMwIGRheXM/IChTZWxlY3Qgb25lIG9yIG1vcmUpCiAgICAgICAgICAgICAgICAgIFE1MEIsICNDbG92ZSBvciBzcGljZQogICAgICAgICAgICAgICAgICBRNTBDLCAjRnJ1aXQKICAgICAgICAgICAgICAgICAgUTUwRCwgI0Nob2NvbGF0ZQogICAgICAgICAgICAgICAgICBRNTBFLCAjQWxjb2hvbGljIERyaW5rCiAgICAgICAgICAgICAgICAgIFE1MEYsICNDYW5keS9EZXNzZXJ0cy9PdGhlciBTd2VldHMKICAgICAgICAgICAgICAgICAgUTUwRywgI1NvbWUgT3RoZXIgRmxhdm9yIE5vdCBMaXN0ZWQgSGVyZQogICAgICAgICAgICAgICAgICBRNTBIICNJIERpZCBOb3QgVXNlIEZsYXZvcmVkIFRvYmFjY28gUHJvZHVjdHMgSW4gdGhlIFBhc3QKICAgICAgICAgICAgICAgICAgKSAlPiUKICAgIHJlbmFtZShBZ2U9UTEsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIEdyYWRlPVEzLAogICAgICAgICAgIE5vdF9ITD1RNEEsCiAgICAgICAgICAgSExfTWV4PVE0QiwKICAgICAgICAgICBITF9QUj1RNEMsCiAgICAgICAgICAgSExfQ3ViPVE0RCwKICAgICAgICAgICBITF9PdGhlcj1RNEUsCiAgICAgICAgICAgUmFjZV9BSUFOPVE1QSwKICAgICAgICAgICBSYWNlX0FzaWFuPVE1QiwKICAgICAgICAgICBSYWNlX0JBQT1RNUMsCiAgICAgICAgICAgUmFjZV9OSE9QST1RNUQsCiAgICAgICAgICAgUmFjZV9XaGl0ZT1RNUUsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIG1lbnRob2w9UTUwQSwKICAgICAgICAgICBjbG92ZV9zcGljZT1RNTBCLAogICAgICAgICAgIGZydWl0PVE1MEMsCiAgICAgICAgICAgY2hvY29sYXRlPVE1MEQsCiAgICAgICAgICAgYWxjb2hvbGljX2RyaW5rPVE1MEUsCiAgICAgICAgICAgY2FuZHlfZGVzc2VydF9zd2VldHM9UTUwRiwKICAgICAgICAgICBvdGhlcj1RNTBHLAogICAgICAgICAgIG5vX3VzZT1RNTBIKSAlPiUKICAgIG11dGF0ZShBZ2UgPSBhcy5udW1lcmljKEFnZSkgKyA4LAogICAgICAgICAgIEdyYWRlID0gYXMubnVtZXJpYyhHcmFkZSkgKyA1LAogICAgICAgICAgIGJyYW5kX2VjaWc9TkEpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJRIikpCgpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTciXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKCm55dHNfZGF0YVtbIm55dHMyMDE3Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE3Il1dICU+JQogIG11dGF0ZV9hbGwofiByZXBsYWNlKC4sIC4gJWluJSBjKCIqIiwgIioqIiksIE5BKSkgJT4lCiAgbXV0YXRlKEFnZT1hcy5jaGFyYWN0ZXIoQWdlKSwKICAgICAgICAgR3JhZGU9YXMuY2hhcmFjdGVyKEdyYWRlKQogICAgICAgICApICU+JQogIG11dGF0ZShBZ2U9cmVjb2RlKEFnZSwKICAgICAgICAgICAgICAgICAgICBgMTlgID0gIj4xOCIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgZmVtYWxlPXJlY29kZShmZW1hbGUsCiAgICAgICAgICAgICAgICAgICAgICBgMWA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgYDJgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJFIiwgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSwKICAgICAgICAgICAgICBsaXN0KH5yZWNvZGUoLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgICBtdXRhdGVfYXQodmFycyhtZW50aG9sOm5vX3VzZSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkKCnNhcHBseShueXRzX2RhdGFbWyJueXRzMjAxNyJdXSwgZnVuY3Rpb24oeCkKICAgIHN1bW1hcnkoCiAgICAgICAgZmFjdG9yKHgpCiAgICAgICAgKQogICAgKQpgYGAKCmBgYHtyfQpueXRzX2RhdGFbWyJueXRzMjAxOCJdXSA8LSBueXRzX2RhdGFbWyJueXRzMjAxOCJdXSAlPiUKICAgIGRwbHlyOjpzZWxlY3QocHN1LAogICAgICAgICAgICAgICAgICBmaW53Z3QsCiAgICAgICAgICAgICAgICAgIHN0cmF0dW0sCiAgICAgICAgICAgICAgICAgIFExLCAjQWdlCiAgICAgICAgICAgICAgICAgIFEyLCAjU2V4CiAgICAgICAgICAgICAgICAgIFEzLCAjR3JhZGUKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlE0IiksICNIaXNwYW5pYy9MYXRpbm8KICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlE1IiksICNSYWNlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgIFE1MEEsICNNZW50aG9sICMgV2hhdCBmbGF2b3JzIG9mIHRvYmFjY28gcHJvZHVjdHMgaGF2ZSB5b3UgdXNlZCBpbiB0aGUgcGFzdCAzMCBkYXlzPyAoU2VsZWN0IG9uZSBvciBtb3JlKQogICAgICAgICAgICAgICAgICBRNTBCLCAjQ2xvdmUgb3Igc3BpY2UKICAgICAgICAgICAgICAgICAgUTUwQywgI0ZydWl0CiAgICAgICAgICAgICAgICAgIFE1MEQsICNDaG9jb2xhdGUKICAgICAgICAgICAgICAgICAgUTUwRSwgI0FsY29ob2xpYyBEcmluawogICAgICAgICAgICAgICAgICBRNTBGLCAjQ2FuZHkvRGVzc2VydHMvT3RoZXIgU3dlZXRzCiAgICAgICAgICAgICAgICAgIFE1MEcsICNTb21lIE90aGVyIEZsYXZvciBOb3QgTGlzdGVkIEhlcmUKICAgICAgICAgICAgICAgICAgUTUwSCAjSSBEaWQgTm90IFVzZSBGbGF2b3JlZCBUb2JhY2NvIFByb2R1Y3RzIEluIHRoZSBQYXN0CiAgICAgICAgICAgICAgICAgICkgJT4lCiAgICByZW5hbWUoQWdlPVExLAogICAgICAgICAgIGZlbWFsZT1RMiwKICAgICAgICAgICBHcmFkZT1RMywKICAgICAgICAgICBOb3RfSEw9UTRBLAogICAgICAgICAgIEhMX01leD1RNEIsCiAgICAgICAgICAgSExfUFI9UTRDLAogICAgICAgICAgIEhMX0N1Yj1RNEQsCiAgICAgICAgICAgSExfT3RoZXI9UTRFLAogICAgICAgICAgIFJhY2VfQUlBTj1RNUEsCiAgICAgICAgICAgUmFjZV9Bc2lhbj1RNUIsCiAgICAgICAgICAgUmFjZV9CQUE9UTVDLAogICAgICAgICAgIFJhY2VfTkhPUEk9UTVELAogICAgICAgICAgIFJhY2VfV2hpdGU9UTVFLAogICAgICAgICAgIGZlbWFsZT1RMiwKICAgICAgICAgICBtZW50aG9sPVE1MEEsCiAgICAgICAgICAgY2xvdmVfc3BpY2U9UTUwQiwKICAgICAgICAgICBmcnVpdD1RNTBDLAogICAgICAgICAgIGNob2NvbGF0ZT1RNTBELAogICAgICAgICAgIGFsY29ob2xpY19kcmluaz1RNTBFLAogICAgICAgICAgIGNhbmR5X2Rlc3NlcnRfc3dlZXRzPVE1MEYsCiAgICAgICAgICAgb3RoZXI9UTUwRywKICAgICAgICAgICBub191c2U9UTUwSCkgJT4lCiAgICBtdXRhdGUoQWdlID0gYXMubnVtZXJpYyhBZ2UpICsgOCwKICAgICAgICAgICBHcmFkZSA9IGFzLm51bWVyaWMoR3JhZGUpICsgNSwKICAgICAgICAgICBicmFuZF9lY2lnPU5BKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiUSIpKQoKc2FwcGx5KG55dHNfZGF0YVtbIm55dHMyMDE4Il1dLCBmdW5jdGlvbih4KQogICAgc3VtbWFyeSgKICAgICAgICBmYWN0b3IoeCkKICAgICAgICApCiAgICApCgpueXRzX2RhdGFbWyJueXRzMjAxOCJdXSA8LSBueXRzX2RhdGFbWyJueXRzMjAxOCJdXSAlPiUKICBtdXRhdGVfYWxsKH4gcmVwbGFjZSguLCAuICVpbiUgYygiKiIsICIqKiIpLCBOQSkpICU+JQogIG11dGF0ZShBZ2U9YXMuY2hhcmFjdGVyKEFnZSksCiAgICAgICAgIEdyYWRlPWFzLmNoYXJhY3RlcihHcmFkZSkKICAgICAgICAgKSAlPiUKICAgIG11dGF0ZShBZ2U9cmVjb2RlKEFnZSwKICAgICAgICAgICAgICAgICAgICBgMTlgID0gIj4xOCIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgZmVtYWxlPXJlY29kZShmZW1hbGUsCiAgICAgICAgICAgICAgICAgICAgICBgMWA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgYDJgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBOQSkpKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKG1lbnRob2w6bm9fdXNlKSwKICAgICAgICAgICAgICBsaXN0KH5yZWNvZGUoLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKQoKc2FwcGx5KG55dHNfZGF0YVtbIm55dHMyMDE4Il1dLCBmdW5jdGlvbih4KQogICAgc3VtbWFyeSgKICAgICAgICBmYWN0b3IoeCkKICAgICAgICApCiAgICApCmBgYAoKYGBge3J9Cm55dHNfZGF0YVtbIm55dHMyMDE5Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE5Il1dICU+JQogICAgZHBseXI6OnNlbGVjdChwc3UsCiAgICAgICAgICAgICAgICAgIGZpbndndCwKICAgICAgICAgICAgICAgICAgc3RyYXR1bSwKICAgICAgICAgICAgICAgICAgUTEsICNBZ2UKICAgICAgICAgICAgICAgICAgUTIsICNTZXgKICAgICAgICAgICAgICAgICAgUTMsICNHcmFkZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUTQiKSwgI0hpc3BhbmljL0xhdGlubwogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUTUiKSwgI1JhY2UKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgLUVIVFAsCiAgICAgICAgICAgICAgICAgIC1DSFRQLAogICAgICAgICAgICAgICAgICBRNDAsICNCcmFuZywgZS1jaWdhcmV0dGVzCiAgICAgICAgICAgICAgICAgIFE2MkEsICNNZW50aG9sICMgV2hhdCBmbGF2b3JzIG9mIHRvYmFjY28gcHJvZHVjdHMgaGF2ZSB5b3UgdXNlZCBpbiB0aGUgcGFzdCAzMCBkYXlzPyAoU2VsZWN0IG9uZSBvciBtb3JlKQogICAgICAgICAgICAgICAgICBRNjJCLCAjQ2xvdmUgb3Igc3BpY2UKICAgICAgICAgICAgICAgICAgUTYyQywgI0ZydWl0IAogICAgICAgICAgICAgICAgICBRNjJELCAjQ2hvY29sYXRlCiAgICAgICAgICAgICAgICAgIFE2MkUsICNBbGNvaG9saWMgRHJpbmsKICAgICAgICAgICAgICAgICAgUTYyRiwgI0NhbmR5L0Rlc3NlcnRzL090aGVyIFN3ZWV0cwogICAgICAgICAgICAgICAgICBRNjJHLCAjU29tZSBPdGhlciBGbGF2b3IgTm90IExpc3RlZCBIZXJlIAogICAgICAgICAgICAgICAgICApICAlPiUKICAgIHJlbmFtZShicmFuZF9lY2lnPVE0MCwKICAgICAgICAgICBBZ2U9UTEsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIEdyYWRlPVEzLAogICAgICAgICAgIE5vdF9ITD1RNEEsCiAgICAgICAgICAgSExfTWV4PVE0QiwKICAgICAgICAgICBITF9QUj1RNEMsCiAgICAgICAgICAgSExfQ3ViPVE0RCwKICAgICAgICAgICBITF9PdGhlcj1RNEUsCiAgICAgICAgICAgUmFjZV9BSUFOPVE1QSwKICAgICAgICAgICBSYWNlX0FzaWFuPVE1QiwKICAgICAgICAgICBSYWNlX0JBQT1RNUMsCiAgICAgICAgICAgUmFjZV9OSE9QST1RNUQsCiAgICAgICAgICAgUmFjZV9XaGl0ZT1RNUUsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIG1lbnRob2w9UTYyQSwKICAgICAgICAgICBjbG92ZV9zcGljZT1RNjJCLAogICAgICAgICAgIGZydWl0PVE2MkMsCiAgICAgICAgICAgY2hvY29sYXRlPVE2MkQsCiAgICAgICAgICAgYWxjb2hvbGljX2RyaW5rPVE2MkUsCiAgICAgICAgICAgY2FuZHlfZGVzc2VydF9zd2VldHM9UTYyRiwKICAgICAgICAgICBvdGhlcj1RNjJHKSAlPiUKICAgIG11dGF0ZShBZ2UgPSBhcy5udW1lcmljKEFnZSkgKyA4LAogICAgICAgICAgIEdyYWRlID0gYXMubnVtZXJpYyhHcmFkZSkgKyA1LAogICAgICAgICAgIG5vX3VzZT0ibWlzc2luZyIpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJRIikpCgpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTkiXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKCm55dHNfZGF0YVtbIm55dHMyMDE5Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE5Il1dICU+JQogIG11dGF0ZV9hbGwofiByZXBsYWNlKC4sIC4gJWluJSBjKCIuTiIsIi5TIiwiLloiKSwgTkEpKSAlPiUKICBtdXRhdGUoQWdlPWFzLmNoYXJhY3RlcihBZ2UpLAogICAgICAgICBHcmFkZT1hcy5jaGFyYWN0ZXIoR3JhZGUpCiAgICAgICAgICkgJT4lCiAgbXV0YXRlKHBzdT1hcy5jaGFyYWN0ZXIocHN1KSwKICAgICAgICAgQWdlPXJlY29kZShBZ2UsCiAgICAgICAgICAgICAgICAgICAgYDE5YCA9ICI+MTgiLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgIGZlbWFsZT1yZWNvZGUoZmVtYWxlLAogICAgICAgICAgICAgICAgICAgICAgYDFgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGAyYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJFIiwgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSwKICAgICAgICAgICAgICBsaXN0KH5yZWNvZGUoLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEpKSkgJT4lCiAgICBtdXRhdGUoYnJhbmRfZWNpZyA9IHJlY29kZShicmFuZF9lY2lnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSAiT3RoZXIiLCAjbGV2ZWxzIDEsOCBjb21iaW5lZCB0byBgT3RoZXJgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAiQmx1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gIkpVVUwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiTG9naWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNWAgPSAiTWFya1RlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA2YCA9ICJOSk9ZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDdgID0gIlZ1c2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgOGAgPSAiT3RoZXIiKSkgJT4lCiAgICBtdXRhdGVfYXQodmFycyhtZW50aG9sOm5vX3VzZSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID1GQUxTRSkpKSAjQXNrIE1pY2hhZWwgYWJvdXQgdGhpcyBpZiB1bmNsZWFyCgpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTkiXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKYGBgCgpgYGB7cn0Kbnl0c19kYXRhIDwtIG55dHNfZGF0YSAlPiUKICBtYXBfZGYoYmluZF9yb3dzLCAuaWQgPSAieWVhciIpICU+JQogIG11dGF0ZSh5ZWFyPWFzLm51bWVyaWMoc3RyX3JlbW92ZSh5ZWFyLCJueXRzIikpKQoKc2FwcGx5KG55dHNfZGF0YSwgY2xhc3MpCgpzYXBwbHkobnl0c19kYXRhLCBmdW5jdGlvbih4KQogICAgc3VtbWFyeSgKICAgICAgICBmYWN0b3IoeCkKICAgICAgICApCiAgICApCmBgYAoKPHN0eWxlPgpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30KPC9zdHlsZT4KPGRpdiBjbGFzcyA9ICJibHVlIj4KClJlbWluZGVyOiBDdXJyZW50IHVzZXJzIGFyZSBhIHN1YnNldCBvZiBldmVyIHVzZXJzLiAKCjwvZGl2PgoKIyBEYXRhIHZpc3VhbGl6YXRpb24KCiMjIFF1ZXN0aW9uIDEgCgpgYGB7cn0KcGxvdDEgPC0gbnl0c19kYXRhICU+JQogICAgbXV0YXRlKHRvYmFjY29fc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgdG9iYWNjb19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSkgJT4lCiAgICBtdXRhdGUodG9iYWNjb19ldmVyID0gY2FzZV93aGVuKHRvYmFjY29fc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9iYWNjb19zdW1fZXZlciA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgdG9iYWNjb19jdXJyZW50ID0gY2FzZV93aGVuKHRvYmFjY29fc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9iYWNjb19zdW1fY3VycmVudCA9PTAgfiBGQUxTRSkpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgICBzdW1tYXJpc2UodG9iYWNjb19ldmVyX3llYXI9KHN1bSh0b2JhY2NvX2V2ZXIsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEodG9iYWNjb19ldmVyKSksCiAgICAgICAgICAgICAgdG9iYWNjb19jdXJyZW50X3llYXI9KHN1bSh0b2JhY2NvX2N1cnJlbnQsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEodG9iYWNjb19jdXJyZW50KSkpICU+JQogICAgcmVuYW1lKCJFdmVyIj10b2JhY2NvX2V2ZXJfeWVhciwKICAgICAgICAgICAiQ3VycmVudCI9dG9iYWNjb19jdXJyZW50X3llYXIpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIlVzZXIiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwgbGluZXR5cGU9VXNlcikpICsKICAgIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoMiwxKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDcwLGJ5PTEwKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMCw3MCxieT0xMCksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLDcwKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHRpdGxlID0gIkhvdyBkb2VzIG5pY290aW5lIHVzZSB2YXJ5IG92ZXIgdGhlIHllYXJzPyIsCiAgICAgICAgIHN1YnRpdGxlID0gIkN1cnJlbnQgYW5kIGV2ZXIgdXNlcnMgb2Ygbmljb3RpbmUgcHJvZHVjdHMiLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdDEgCmBgYAoKIyMgUXVlc3Rpb24gMgoKYGBge3J9CnBsb3QyIDwtIG55dHNfZGF0YSAlPiUKICAgIGdyb3VwX2J5KHllYXIsCiAgICAgICAgICAgICBmZW1hbGUpICU+JQogICAgc3VtbWFyaXNlKEVFTENJR1RfeWVhcj0oc3VtKEVFTENJR1QsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoRUVMQ0lHVCkpLAogICAgICAgICAgICAgIENFTENJR1RfeWVhcj0oc3VtKENFTENJR1QsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoQ0VMQ0lHVCkpKSAlPiUgCiAgICBmaWx0ZXIoIWlzLm5hKGZlbWFsZSkpICU+JQogICAgcmVuYW1lKCJFLWNpZ2FyZXR0ZXMsIEV2ZXIiPUVFTENJR1RfeWVhciwKICAgICAgICAgICAiRS1jaWdhcmV0dGVzLCBDdXJyZW50Ij1DRUxDSUdUX3llYXIpICU+JQogICNjb252ZXJ0aW5nIGFsbCBjb2x1bW5zIGJldHdlZW4gYW5kIGluY2x1ZGluZyBgRS1jaWdhcmV0dGVzLCBFdmVyYCBhbmQgYEUtY2lnYXJldHRlcywgQ3VycmVudGAgaW50byBvbmUgY29sdW1uIGNhbGxlZCBjYXRlZ29yeQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBgRS1jaWdhcmV0dGVzLCBFdmVyYDpgRS1jaWdhcmV0dGVzLCBDdXJyZW50YCwgbmFtZXNfdG8gPSAiQ2F0ZWdvcnkiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpJT4lCiAgICBtdXRhdGUoVXNlciA9IGNhc2Vfd2hlbihDYXRlZ29yeSA9PSAiRS1jaWdhcmV0dGVzLCBFdmVyIiB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09ICJFLWNpZ2FyZXR0ZXMsIEN1cnJlbnQiIH4gIkN1cnJlbnQiKSkgJT4lCiAgICBtdXRhdGUoU2V4ID0gY2FzZV93aGVuKGZlbWFsZSA9PSBUUlVFIH4gIkZlbWFsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVtYWxlID09IEZBTFNFIH4gIk1hbGVzIikpICU+JQogICAgZ2dwbG90KGFlcyh4PXllYXIseT1gUGVyY2VudGFnZSBvZiBzdHVkZW50c2AsIGNvbG9yPVNleCwgbGluZXR5cGU9VXNlcikpICsKICAgIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoMiwxKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiSG93IGRvIHZhcGluZyByYXRlcyBjb21wYXJlIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXM/IiwKICAgICAgICAgc3VidGl0bGUgPSAiQ3VycmVudCBhbmQgZXZlciB1c2VycyBieSBnZW5kZXIiLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdDIKYGBgCgojIyBRdWVzdGlvbiAzCgpXaGF0IHZhcGluZyBicmFuZHMgYW5kIGZsYXZvcnMgYXBwZWFyIHRvIGJlIHVzZWQgdGhlIG1vc3QgZnJlcXVlbnRseT8KCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuY2FwPSJIdWFuZyBKLCBEdWFuIFosIEt3b2sgSiwgZXQgYWwuIFRvYiBDb250cm9sIDIwMTk7Mjg6MTQ24oCTMTUxLiIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIkh1YW5nSl9EdWFuWl9Ld29rSl9ldF9hbF9Ub2JhY2NvQ29udHJvbF9GaWd1cmUxLnBuZyIpKQpgYGAKCltQYXBlcl0oaHR0cHM6Ly90b2JhY2NvY29udHJvbC5ibWouY29tL2NvbnRlbnQvdG9iYWNjb2NvbnRyb2wvMjgvMi8xNDYuZnVsbC5wZGYpCgoKYGBge3J9CnBsb3QzIDwtIG55dHNfZGF0YSAlPiUKICAgIGZpbHRlcih5ZWFyPT0yMDE5KSAlPiUKICAgIGdyb3VwX2J5KGJyYW5kX2VjaWcpICU+JQogICAgZmlsdGVyKCFpcy5uYShicmFuZF9lY2lnKSkgJT4lCiAgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgICBtdXRhdGUodG90YWwgPSBzdW0obiksCiAgICAgICAgICAgUGVyY2VudCA9IG4qMTAwL3RvdGFsKSAlPiUKICAgIG11dGF0ZShicmFuZF9lY2lnID0gZmN0X3Jlb3JkZXIoYnJhbmRfZWNpZywgZGVzYyhQZXJjZW50KSkpICU+JQogICAgZ2dwbG90KGFlcyh4PWJyYW5kX2VjaWcseT1QZXJjZW50LCBmaWxsPWJyYW5kX2VjaWcpKSArCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgbGFicyh0aXRsZSA9ICJXaGF0IHZhcGluZyBicmFuZHMgYXBwZWFyIHRvIGJlIHVzZWQgdGhlIG1vc3QgZnJlcXVlbnRseT8iLAogICAgICAgICBzdWJ0aXRsZSA9ICJCcmFuZCBvZiBlLWNpZ2FyZXR0ZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBpbiB0aGUgbGFzdCAzMCBkYXlzICgyMDE5KSIsCiAgICAgICAgIHkgPSAiJSBvZiBlLWNpZ2FyZXR0ZSB1c2VycyByZXNwb25kaW5nIikKCnBsb3QzCmBgYAoKYGBge3J9CnBsb3Q0IDwtIG55dHNfZGF0YSAlPiUKICBmaWx0ZXIoeWVhciE9MjAxNSkgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKE1lbnRob2w9KHN1bShtZW50aG9sLCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKG1lbnRob2wpKSwKICAgICAgICAgICAgICBgQ2xvdmUgb3IgU3BpY2VgPShzdW0oY2xvdmVfc3BpY2UsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoY2xvdmVfc3BpY2UpKSwKICAgICAgICAgICAgICBgRnJ1aXRgPShzdW0oZnJ1aXQsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoZnJ1aXQpKSwKICAgICAgICAgICAgICBgQ2hvY29sYXRlYD0oc3VtKGNob2NvbGF0ZSwgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgICAgc3VtKCFpcy5uYShjaG9jb2xhdGUpKSwKICAgICAgICAgICAgICBgQWxjb2hvbGljIERyaW5rYD0oc3VtKGFsY29ob2xpY19kcmluaywgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgICAgc3VtKCFpcy5uYShhbGNvaG9saWNfZHJpbmspKSwKICAgICAgICAgICAgICBgQ2FuZHkvRGVzc2VydHMvU3dlZXRzYD0oc3VtKGNhbmR5X2Rlc3NlcnRfc3dlZXRzLCBuYS5ybSA9IFRSVUUpKjEwMCkvc3VtKCFpcy5uYShjYW5keV9kZXNzZXJ0X3N3ZWV0cykpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC15ZWFyLCBuYW1lc190byA9ICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIiwgdmFsdWVzX3RvID0gIkZsYXZvciIpICU+JQoKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT1gUGVyY2VudGFnZSBvZiBzdHVkZW50c2AsIGNvbG9yPUZsYXZvcikpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnModGl0bGUgPSAiV2hhdCBmbGF2b3JzIGFwcGVhciB0byBiZSB1c2VkIHRoZSBtb3N0IGZyZXF1ZW50bHkgaW4gbmljb3RpbmUgcHJvZHVjdHM/IiwKICAgICAgIHN1YnRpdGxlID0gIkZsYXZvcnMgb2YgdG9iYWNjbyBwcm9kdWN0cyB1c2VkIGluIHRoZSBwYXN0IDMwIGRheXMiKQoKcGxvdDQgCmBgYAoKYGBge3J9CnBsb3Q1IDwtIG55dHNfZGF0YSAlPiUKICBmaWx0ZXIoeWVhciE9MjAxNSkgJT4lCiAgZmlsdGVyKG1lbnRob2w9PVRSVUV8CiAgICAgICAgICAgY2xvdmVfc3BpY2U9PVRSVUV8CiAgICAgICAgICAgZnJ1aXQ9PVRSVUV8CiAgICAgICAgICAgY2hvY29sYXRlPT1UUlVFfAogICAgICAgICAgIGFsY29ob2xpY19kcmluaz09VFJVRXwKICAgICAgICAgICBjYW5keV9kZXNzZXJ0X3N3ZWV0cz09VFJVRXwKICAgICAgICAgICBvdGhlcj09VFJVRSkgJT4lCiAgbXV0YXRlKGVjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgRUVMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBDRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fZXZlciA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJDIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBzZWxlY3QoLiwtQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSkpICU+JQogICAgbXV0YXRlKGVjaWdfZXZlciA9IGNhc2Vfd2hlbihlY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIGVjaWdfY3VycmVudCA9IGNhc2Vfd2hlbihlY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2V2ZXIgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpKSAlPiUKICBtdXRhdGUoZWNpZ19vbmx5X2V2ZXIgPSBjYXNlX3doZW4oZWNpZ19ldmVyID09IFRSVUUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXIgPT1GQUxTRSB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBGQUxTRSksCiAgICAgICAgICAgZWNpZ19vbmx5X2N1cnJlbnQgPSBjYXNlX3doZW4oZWNpZ19jdXJyZW50ID09IFRSVUUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfZXZlciA9PUZBTFNFIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19vbmx5X2V2ZXIgPSBjYXNlX3doZW4obm9uX2VjaWdfZXZlciA9PSBUUlVFICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX2V2ZXIgPT1GQUxTRSB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBGQUxTRSksCiAgICAgICAgICAgbm9uX2VjaWdfb25seV9jdXJyZW50ID0gY2FzZV93aGVuKG5vbl9lY2lnX2N1cnJlbnQgPT0gVFJVRSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNpZ19ldmVyID09RkFMU0UgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gRkFMU0UpKSAlPiUKICBtdXRhdGUoR3JvdXAgPSBjYXNlX3doZW4oZWNpZ19vbmx5X2V2ZXI9PVRSVUUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfb25seV9jdXJyZW50PT1UUlVFIH4gIk9ubHkgZS1jaWdhcmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX29ubHlfZXZlcj09VFJVRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX29ubHlfY3VycmVudD09VFJVRSB+ICJPbmx5IG90aGVyIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJCb3RoIikpICU+JQogIGZpbHRlcihHcm91cCE9IkJvdGgiKSAlPiUKICBncm91cF9ieSh5ZWFyLCBHcm91cCkgJT4lCiAgc3VtbWFyaXNlKGBNZW50aG9sYD0oc3VtKG1lbnRob2wsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICBzdW0oIWlzLm5hKG1lbnRob2wpKSwKICAgICAgICAgICAgICBgQ2xvdmUgb3IgU3BpY2VgPShzdW0oY2xvdmVfc3BpY2UsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICBzdW0oIWlzLm5hKGNsb3ZlX3NwaWNlKSksCiAgICAgICAgICAgICAgYEZydWl0YD0oc3VtKGZydWl0LCBuYS5ybSA9IFRSVUUpKjEwMCkvc3VtKCFpcy5uYShmcnVpdCkpLAogICAgICAgICAgICAgIGBDaG9jb2xhdGVgPShzdW0oY2hvY29sYXRlLCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgc3VtKCFpcy5uYShjaG9jb2xhdGUpKSwKICAgICAgICAgICAgICBgQWxjb2hvbGljIERyaW5rYD0oc3VtKGFsY29ob2xpY19kcmluaywgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgIHN1bSghaXMubmEoYWxjb2hvbGljX2RyaW5rKSksCiAgICAgICAgICAgICAgYENhbmR5L0Rlc3NlcnRzL1N3ZWV0c2A9KHN1bShjYW5keV9kZXNzZXJ0X3N3ZWV0cywgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgIHN1bSghaXMubmEoY2FuZHlfZGVzc2VydF9zd2VldHMpKSwKICAgICAgICAgICAgYE90aGVyYD0oc3VtKG90aGVyLCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgc3VtKCFpcy5uYShvdGhlcikpLAogICAgICAgICAgICBSZXNwb25kZW50cz1uKCkpICU+JQogICNjb252ZXJ0aW5nIGFsbCBjb2x1bW5zIGJldHdlZW4gYW5kIGluY2x1ZGluZyBNZW50aG9sIGFuZCBPdGhlciB0byBvbmUgY29sdW1uIGNhbGxlZCBGbGF2b3IKICBwaXZvdF9sb25nZXIoY29scyA9IE1lbnRob2w6T3RoZXIsIG5hbWVzX3RvID0gIkZsYXZvciIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIikgJT4lCiAgZmlsdGVyKCFpcy5uYShgUGVyY2VudGFnZSBvZiBzdHVkZW50c2ApLAogICAgICAgICBGbGF2b3IhPSJPdGhlciIpICU+JQogIGdyb3VwX2J5KEZsYXZvcikgJT4lCiAgbXV0YXRlKGFmZmlybWF0aXZlPShSZXNwb25kZW50cyAqIGBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCkvMTAwKSAlPiUKICBtdXRhdGUoZmxhdm9yX21lYW4gPSBzdW0oYWZmaXJtYXRpdmUpL3N1bShSZXNwb25kZW50cykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoZmxhdm9yX21lYW5fcmFuayA9IGRlbnNlX3JhbmsoZmxhdm9yX21lYW4pLAogICAgICAgICBGbGF2b3IgPSBmY3RfcmVvcmRlcihGbGF2b3IsIGZsYXZvcl9tZWFuX3JhbmspKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT1gUGVyY2VudGFnZSBvZiBzdHVkZW50c2AsIGNvbG9yPUdyb3VwKSkgKwogIGZhY2V0X3dyYXAoLn5GbGF2b3IsbmNvbD0zKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKyAKICBsYWJzKHRpdGxlID0gIkFtb25nIHVzZXJzIG9mIG9ubHkgb25lIHR5cGUgb2YgcHJvZHVjdCwgd2hhdCB2YXBpbmcgZmxhdm9ycyBhcHBlYXIgdG8gYmUgdXNlZCB0aGUgbW9zdCBmcmVxdWVudGx5PyIsCiAgICAgICBzdWJ0aXRsZSA9ICJQZXJjZW50IHJlcG9ydGluZyBvbmx5IGUtY2lnYXJldHRlIHVzZSB2cyBvbmx5IG90aGVyIG5pY290aW5lIHByb2R1Y3QgdXNlIikKCnBsb3Q1CmBgYAoKIyMgUXVlc3Rpb24gNAoKSGF2ZSB2YXBpbmcgcmF0ZXMgcG9zc2libHkgaW5mbHVlbmNlZCB0b2JhY2NvL25pY290aW5lIHVzZT8KCmBgYHtyfQpwbG90NiA8LSBueXRzX2RhdGEgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShFQ0lHVF95ZWFyPShzdW0oRUNJR1QsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoRUNJR1QpKSwKICAgICAgICAgICAgICBFRUxDSUdUX3llYXI9KHN1bShFRUxDSUdULCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKEVFTENJR1QpKSwKICAgICAgICAgICAgICBDQ0lHVF95ZWFyPShzdW0oQ0NJR1QsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoQ0NJR1QpKSwKICAgICAgICAgICAgICBDRUxDSUdUX3llYXI9KHN1bShDRUxDSUdULCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKENFTENJR1QpKSkgJT4lCiAgICByZW5hbWUoIkNpZ2FyZXR0ZXMsIEV2ZXIiPUVDSUdUX3llYXIsCiAgICAgICAgICAgIkUtY2lnYXJldHRlcywgRXZlciI9RUVMQ0lHVF95ZWFyLAogICAgICAgICAgICJDaWdhcmV0dGVzLCBDdXJyZW50Ij1DQ0lHVF95ZWFyLAogICAgICAgICAgICJFLWNpZ2FyZXR0ZXMsIEN1cnJlbnQiPUNFTENJR1RfeWVhcikgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHM9IC15ZWFyLCBuYW1lc190byA9ICJDYXRlZ29yeSIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIiklPiUKICAgICMgZ2F0aGVyKGtleT1DYXRlZ29yeSwKICAgICMgICAgICAgIHZhbHVlPWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwKICAgICMgICAgICAgIC15ZWFyKSAlPiUKICAgIG11dGF0ZShVc2VyID0gY2FzZV93aGVuKENhdGVnb3J5ID09ICJDaWdhcmV0dGVzLCBFdmVyIiB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09ICJFLWNpZ2FyZXR0ZXMsIEV2ZXIiIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0gIkNpZ2FyZXR0ZXMsIEN1cnJlbnQiIH4gIkN1cnJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0gIkUtY2lnYXJldHRlcywgQ3VycmVudCIgfiAiQ3VycmVudCIpKSAlPiUKICAgIG11dGF0ZShQcm9kdWN0ID0gY2FzZV93aGVuKENhdGVnb3J5ID09ICJDaWdhcmV0dGVzLCBFdmVyIiB+ICJDaWdhcmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09ICJFLWNpZ2FyZXR0ZXMsIEV2ZXIiIH4gIkUtY2lnYXJldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSAiQ2lnYXJldHRlcywgQ3VycmVudCIgfiAiQ2lnYXJldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSAiRS1jaWdhcmV0dGVzLCBDdXJyZW50IiB+ICJFLWNpZ2FyZXR0ZXMiKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwgY29sb3I9UHJvZHVjdCwgbGluZXR5cGU9VXNlcikpICsKICAgIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoMiwxKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHRpdGxlID0gIkhvdyBkb2VzIGUtY2lnYXJldHRlIHVzZSBjb21wYXJlIHRvIGNpZ2FyZXR0ZSB1c2U/IiwKICAgICAgICAgc3VidGl0bGUgPSAiQ3VycmVudCBhbmQgZXZlciB1c2VycyBvZiBlLWNpZ2FyZXR0ZXMgYW5kIGNpZ2FyZXR0ZXMiLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdDYKYGBgCgpgYGB7cn0KcGxvdDcgPC0gbnl0c19kYXRhICU+JQogICAgbXV0YXRlKGVjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgRUVMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBDRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fZXZlciA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJDIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBzZWxlY3QoLiwtQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSkpICU+JQogICAgbXV0YXRlKGVjaWdfZXZlciA9IGNhc2Vfd2hlbihlY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIGVjaWdfY3VycmVudCA9IGNhc2Vfd2hlbihlY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2V2ZXIgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpKSAlPiUKICAgIGdyb3VwX2J5KHllYXIpICU+JQogICAgc3VtbWFyaXNlKGVjaWdfZXZlcl95ZWFyPShzdW0oZWNpZ19ldmVyLCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKGVjaWdfZXZlcikpLAogICAgICAgICAgICAgIGVjaWdfY3VycmVudF95ZWFyPShzdW0oZWNpZ19jdXJyZW50LCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKGVjaWdfY3VycmVudCkpLAogICAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXJfeWVhcj0oc3VtKG5vbl9lY2lnX2V2ZXIsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEobm9uX2VjaWdfZXZlcikpLAogICAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhcj0oc3VtKG5vbl9lY2lnX2N1cnJlbnQsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEobm9uX2VjaWdfY3VycmVudCkpKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIkNhdGVnb3J5IiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHMiKSAlPiUKICAgIG11dGF0ZShVc2VyID0gY2FzZV93aGVuKENhdGVnb3J5ID09ImVjaWdfZXZlcl95ZWFyIiB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0ibm9uX2VjaWdfZXZlcl95ZWFyIiB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0iZWNpZ19jdXJyZW50X3llYXIiIH4gIkN1cnJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJub25fZWNpZ19jdXJyZW50X3llYXIiIH4gIkN1cnJlbnQiKSkgJT4lCiAgICBtdXRhdGUoUHJvZHVjdCA9IGNhc2Vfd2hlbihDYXRlZ29yeSA9PSJlY2lnX2V2ZXJfeWVhciIgfiAiRS1jaWdhcmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0ibm9uX2VjaWdfZXZlcl95ZWFyIiB+ICJPdGhlciBwcm9kdWN0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09ImVjaWdfY3VycmVudF95ZWFyIiB+ICJFLWNpZ2FyZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJub25fZWNpZ19jdXJyZW50X3llYXIiIH4gIk90aGVyIHByb2R1Y3RzIikpICU+JQogICAgZmlsdGVyKFVzZXI9PSJFdmVyIikgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwgY29sb3I9UHJvZHVjdCkpICsKICAgIGdlb21fbGluZShsaW5ldHlwZT0xKSArICMgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEwLCA2MCwgYnkgPSAxMCksIGxpbWl0cyA9IGMoMTAsNjApKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiSG93IGRvZXMgZS1jaWdhcmV0dGUgZXZlciB1c2UgY29tcGFyZSB0byBldmVyIHVzZSBvZiBvdGhlciBwcm9kdWN0cyBvdmVyIHRoZSB5ZWFycz8iLAogICAgICAgICBzdWJ0aXRsZSA9ICJFLWNpZ2FyZXR0ZSBhbmQgbm9uLWUtY2lnYXJldHRlIHVzZSIsCiAgICAgICAgIHkgPSAiJSBvZiBzdHVkZW50cyIpCgpwbG90NwpgYGAKCmBgYHtyfQpwbG90OCA8LSBueXRzX2RhdGEgJT4lCiAgICBtdXRhdGUoZWNpZ19zdW1fZXZlciA9IHNlbGVjdCguLCBFRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBlY2lnX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIENFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIG5vbl9lY2lnX3N1bV9ldmVyID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJFIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBzZWxlY3QoLiwtRUVMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgbm9uX2VjaWdfc3VtX2N1cnJlbnQgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkMiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIHNlbGVjdCguLC1DRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSkgJT4lCiAgICBtdXRhdGUoZWNpZ19ldmVyID0gY2FzZV93aGVuKGVjaWdfc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNpZ19zdW1fZXZlciA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgZWNpZ19jdXJyZW50ID0gY2FzZV93aGVuKGVjaWdfc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNpZ19zdW1fY3VycmVudCA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgbm9uX2VjaWdfZXZlciA9IGNhc2Vfd2hlbihub25fZWNpZ19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fZWNpZ19zdW1fZXZlciA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgbm9uX2VjaWdfY3VycmVudCA9IGNhc2Vfd2hlbihub25fZWNpZ19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fZWNpZ19zdW1fY3VycmVudCA9PTAgfiBGQUxTRSkpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgICBzdW1tYXJpc2UoZWNpZ19ldmVyX3llYXI9KHN1bShlY2lnX2V2ZXIsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoZWNpZ19ldmVyKSksCiAgICAgICAgICAgICAgZWNpZ19jdXJyZW50X3llYXI9KHN1bShlY2lnX2N1cnJlbnQsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoZWNpZ19jdXJyZW50KSksCiAgICAgICAgICAgICAgbm9uX2VjaWdfZXZlcl95ZWFyPShzdW0obm9uX2VjaWdfZXZlciwgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgICAgc3VtKCFpcy5uYShub25fZWNpZ19ldmVyKSksCiAgICAgICAgICAgICAgbm9uX2VjaWdfY3VycmVudF95ZWFyPShzdW0obm9uX2VjaWdfY3VycmVudCwgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgICAgc3VtKCFpcy5uYShub25fZWNpZ19jdXJyZW50KSkpICU+JQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAteWVhciwgbmFtZXNfdG8gPSAiQ2F0ZWdvcnkiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpICU+JQogICAgIyBnYXRoZXIoa2V5PUNhdGVnb3J5LAogICAgIyAgICAgICAgdmFsdWU9YFBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHNgLAogICAgIyAgICAgICAgLXllYXIpICU+JQogICAgbXV0YXRlKFVzZXIgPSBjYXNlX3doZW4oQ2F0ZWdvcnkgPT0iZWNpZ19ldmVyX3llYXIiIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJub25fZWNpZ19ldmVyX3llYXIiIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJlY2lnX2N1cnJlbnRfeWVhciIgfiAiQ3VycmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09Im5vbl9lY2lnX2N1cnJlbnRfeWVhciIgfiAiQ3VycmVudCIpKSAlPiUKICAgIG11dGF0ZShQcm9kdWN0ID0gY2FzZV93aGVuKENhdGVnb3J5ID09ImVjaWdfZXZlcl95ZWFyIiB+ICJFLWNpZ2FyZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJub25fZWNpZ19ldmVyX3llYXIiIH4gIk90aGVyIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0iZWNpZ19jdXJyZW50X3llYXIiIH4gIkUtY2lnYXJldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09Im5vbl9lY2lnX2N1cnJlbnRfeWVhciIgfiAiT3RoZXIgcHJvZHVjdHMiKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwgY29sb3I9UHJvZHVjdCwgbGluZXR5cGU9VXNlcikpICsKICAgIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygyLDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgYnkgPSAxMCksIGxpbWl0cyA9IGMoMCw2MCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgbGFicyh0aXRsZSA9ICJIb3cgZG9lcyBlLWNpZ2FyZXR0ZSB1c2UgY29tcGFyZSB0byB1c2Ugb2Ygb3RoZXIgcHJvZHVjdHMgb3ZlciB0aGUgeWVhcnM/IiwKICAgICAgICAgc3VidGl0bGUgPSAiRS1jaWdhcmV0dGUgYW5kIG5vbi1lLWNpZ2FyZXR0ZSB1c2UiLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdDgKYGBgCgojIyMgVW53ZWlnaHRlZCBTYW1wbGUKCmBgYHtyLCBmaWcuaGVpZ2h0PTEwfQpwbG90QV91dyA8LSBwbG90MSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgbGFicyh0aXRsZSA9ICJOaWNvdGluZSBwcm9kdWN0IHVzZXJzIG1vcmUgcHJldmFsZW50IGFmdGVyIDIwMTciLAogICAgICAgICBzdWJ0aXRsZSA9IE5VTEwsCiAgICAgICAgIHkgPSAiJSBvZiBzdHVkZW50cyIpCgpwbG90Ql91dyA8LSBwbG90NyArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIGxhYnModGl0bGUgPSAiJSBFdmVyIHRyeWluZyBlLWNpZ2FyZXR0ZXMgaW5jcmVhc2VzICZcbiUgZXZlciB0cnlpbmcgb3RoZXIgcHJvZHVjdHMgZGVjcmVhc2VzIiwKICAgICAgICAgc3VidGl0bGUgPSBOVUxMLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdENfdXcgPC0gcGxvdDggKyAKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICBsYWJzKHRpdGxlID0gIiUgVXNpbmcgZS1jaWdhcmV0dGVzIGluY3JlYXNlcyAmXG4lIHVzaW5nIE90aGVyIHByb2R1Y3RzIGRlY3JlYXNlcyIsCiAgICAgICAgIHN1YnRpdGxlID0gTlVMTCwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCnRpdGxlX3V3IDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgKICAgICJIYXZlIHZhcGluZyByYXRlcyBwb3NzaWJseSBpbmZsdWVuY2VkIHRvYmFjY28vbmljb3RpbmUgdXNlPyIsCiAgICBmb250ZmFjZSA9ICdib2xkJywKICAgIHNpemU9MTQsCiAgICB4ID0gMCwKICAgIGhqdXN0ID0gMAogICkgKwogIHRoZW1lKAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMCkKICApCgpwbG90c0FfdXcgPC0gcGxvdF9ncmlkKHBsb3RBX3V3LAogICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygxLDEpKQpwbG90c0JDX3V3IDwtIHBsb3RfZ3JpZChwbG90Ql91dywKICAgICAgICAgICAgICAgICAgICAgICAgcGxvdENfdXcsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsMSkpCgpsZWdlbmRfdXcgPC0gZ2V0X2xlZ2VuZChwbG90Ql91dyArCiAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikpCgpmaWd1cmVfdXcgPC0gcGxvdF9ncmlkKHRpdGxlX3V3LAogICAgICAgICAgICAgICAgICAgICAgIHBsb3RzQV91dywKICAgICAgICAgICAgICAgICAgICAgICBwbG90c0JDX3V3LAogICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZF91dywKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gMS4wKQoKZmlndXJlX3V3CmBgYAoKIyMjIFdlaWdodGVkIFNhbXBsZQoKYGBge3J9CnBsb3RBX3cgPC0gbnl0c19kYXRhICU+JQogICAgbXV0YXRlKHRvYmFjY29fc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgdG9iYWNjb19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSkgJT4lCiAgICBtdXRhdGUodG9iYWNjb19ldmVyID0gY2FzZV93aGVuKHRvYmFjY29fc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9iYWNjb19zdW1fZXZlciA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgdG9iYWNjb19jdXJyZW50ID0gY2FzZV93aGVuKHRvYmFjY29fc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9iYWNjb19zdW1fY3VycmVudCA9PTAgfiBGQUxTRSkpICU+JQogIGFzX3N1cnZleV9kZXNpZ24oc3RyYXRhID0gc3RyYXR1bSwgaWRzID0gcHN1LCB3ZWlnaHQgID0gZmlud2d0LCBuZXN0PVRSVUUpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvYmFjY29fZXZlcl95ZWFyID0gc3VydmV5X21lYW4odG9iYWNjb19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIHRvYmFjY29fY3VycmVudF95ZWFyID0gc3VydmV5X21lYW4odG9iYWNjb19jdXJyZW50LCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSkpICAlPiUKICBtdXRhdGVfYXQodmFycygteWVhciksICIqIiwgMTAwKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIlR5cGUiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpICU+JQogICAgIyBnYXRoZXIoa2V5PVR5cGUsCiAgICAjICAgICAgICB2YWx1ZT1gUGVyY2VudGFnZSBvZiBzdHVkZW50c2AsCiAgICAjICAgICAgICAteWVhcikgJT4lCiAgbXV0YXRlKEVzdGltYXRlID0gY2FzZV93aGVuKGdyZXBsKCJfbG93IiwgVHlwZSkgfiAiTG93ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJfdXBwIiwgVHlwZSkgfiAiVXBwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTWVhbiIpLAogICAgICAgICBVc2VyID0gY2FzZV93aGVuKGdyZXBsKCJldmVyIiwgVHlwZSkgfiAiRXZlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImN1cnJlbnQiLCBUeXBlKSB+ICJDdXJyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk1lYW4iKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtVHlwZSkgJT4lCiMgIHBpdm90X3dpZGVyX3NwZWMoKQogIHNwcmVhZChFc3RpbWF0ZSwgYFBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHNgKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhcix5PU1lYW4pKSArCiAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1Vc2VyKSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygyLDEpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsNzAsYnk9MTApLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgwLDcwLGJ5PTEwKSwKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsNzApKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHRpdGxlID0gIk5pY290aW5lIHByb2R1Y3QgdXNlcnMgbW9yZSBwcmV2YWxlbnQgYWZ0ZXIgMjAxNyIsCiAgICAgICAgIHkgPSAiJSBvZiBzdHVkZW50cyIpCgpwbG90Ql93IDwtIG55dHNfZGF0YSAlPiUKICAgIG11dGF0ZShlY2lnX3N1bV9ldmVyID0gc2VsZWN0KC4sIEVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPSBzZWxlY3QoLiwgQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIHNlbGVjdCguLC1FRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUNFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpKSAlPiUKICAgIG11dGF0ZShlY2lnX2V2ZXIgPSBjYXNlX3doZW4oZWNpZ19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBlY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4oZWNpZ19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19ldmVyID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19jdXJyZW50ID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSkgJT4lCiAgYXNfc3VydmV5X2Rlc2lnbihzdHJhdGEgPSBzdHJhdHVtLCBpZHMgPSBwc3UsIHdlaWdodCAgPSBmaW53Z3QsIG5lc3Q9VFJVRSkgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShlY2lnX2V2ZXJfeWVhciA9IHN1cnZleV9tZWFuKGVjaWdfZXZlciwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBlY2lnX2N1cnJlbnRfeWVhciA9IHN1cnZleV9tZWFuKGVjaWdfY3VycmVudCwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBub25fZWNpZ19ldmVyX3llYXIgPSBzdXJ2ZXlfbWVhbihub25fZWNpZ19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhciA9IHN1cnZleV9tZWFuKG5vbl9lY2lnX2N1cnJlbnQsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXllYXIpLCAiKiIsIDEwMCkgJT4lCiAgZHBseXI6OnNlbGVjdCh5ZWFyLAogICAgICAgICAgICAgICAgZWNpZ19ldmVyX3llYXIsCiAgICAgICAgICAgICAgICBlY2lnX2N1cnJlbnRfeWVhciwKICAgICAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXJfeWVhciwKICAgICAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhciwKICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJsb3ciKSwKICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJ1cHAiKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAteWVhciwgbmFtZXNfdG8gPSAiQ2F0ZWdvcnkiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpICU+JQogICAgIyBnYXRoZXIoa2V5PUNhdGVnb3J5LAogICAgIyAgICAgICAgdmFsdWU9YFBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHNgLAogICAgIyAgICAgICAgLXllYXIpICAlPiUKICBtdXRhdGUoRXN0aW1hdGUgPSBjYXNlX3doZW4oZ3JlcGwoIl9sb3ciLCBDYXRlZ29yeSkgfiAiTG93ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJfdXBwIiwgQ2F0ZWdvcnkpIH4gIlVwcGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk1lYW4iKSwKICAgICAgICAgVXNlciA9IGNhc2Vfd2hlbihncmVwbCgiY3VycmVudCIsIENhdGVnb3J5KSB+ICJDdXJyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkV2ZXIiLCksCiAgICAgICAgIFByb2R1Y3QgPSBjYXNlX3doZW4oZ3JlcGwoIm5vbl9lY2lnIiwgQ2F0ZWdvcnkpIH4gIk90aGVyIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkUtY2lnYXJldHRlcyIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1DYXRlZ29yeSkgJT4lCiAgc3ByZWFkKEVzdGltYXRlLCBgUGVyY2VudGFnZSBvZiBzdHVkZW50c2ApICU+JQogIGZpbHRlcihVc2VyPT0iRXZlciIpICU+JQogIGRwbHlyOjpyZW5hbWUoIkxvd2VyX3RlbXAiID0gVXBwZXIsCiAgICAgICAgICAgICAgICAiVXBwZXJfdGVtcCIgPSBMb3dlcikgJT4lCiAgZHBseXI6OnJlbmFtZSgiTG93ZXIiPUxvd2VyX3RlbXAsCiAgICAgICAgICAgICAgICAiVXBwZXIiPVVwcGVyX3RlbXApICU+JQogICAgZ2dwbG90KGFlcyh4PXllYXIseT1NZWFuLCBjb2xvcj1Qcm9kdWN0KSkgKwogIGdlb21fbGluZShsaW5ldHlwZT0xKSArCiAgZ2VvbV9saW5lcmFuZ2UoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMTAsIDYwLCBieSA9IDEwKSwgbGltaXRzID0gYygxMCw2MCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiJSBldmVyIHRyeWluZyBlLWNpZ2FyZXR0ZXMgaW5jcmVhc2VzICZcbiUgZXZlciB0cnlpbmcgb3RoZXIgcHJvZHVjdHMgZGVjcmVhc2VzIiwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCiMjIyMgdGhlIHdyYW5nbGluZyBsb29rcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgcGxvdC4uLgpwbG90Q193IDwtIG55dHNfZGF0YSAlPiUKICAgIG11dGF0ZShlY2lnX3N1bV9ldmVyID0gc2VsZWN0KC4sIEVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPSBzZWxlY3QoLiwgQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIHNlbGVjdCguLC1FRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUNFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpKSAlPiUKICAgIG11dGF0ZShlY2lnX2V2ZXIgPSBjYXNlX3doZW4oZWNpZ19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBlY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4oZWNpZ19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19ldmVyID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19jdXJyZW50ID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSkgJT4lCiAgYXNfc3VydmV5X2Rlc2lnbihzdHJhdGEgPSBzdHJhdHVtLCBpZHMgPSBwc3UsIHdlaWdodCAgPSBmaW53Z3QsIG5lc3Q9VFJVRSkgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpc2UoZWNpZ19ldmVyX3llYXIgPSBzdXJ2ZXlfbWVhbihlY2lnX2V2ZXIsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgZWNpZ19jdXJyZW50X3llYXIgPSBzdXJ2ZXlfbWVhbihlY2lnX2N1cnJlbnQsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgbm9uX2VjaWdfZXZlcl95ZWFyID0gc3VydmV5X21lYW4obm9uX2VjaWdfZXZlciwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBub25fZWNpZ19jdXJyZW50X3llYXIgPSBzdXJ2ZXlfbWVhbihub25fZWNpZ19jdXJyZW50LCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKC15ZWFyKSwgIioiLCAxMDApICU+JQogIGRwbHlyOjpzZWxlY3QoeWVhciwKICAgICAgICAgICAgICAgIGVjaWdfZXZlcl95ZWFyLAogICAgICAgICAgICAgICAgZWNpZ19jdXJyZW50X3llYXIsCiAgICAgICAgICAgICAgICBub25fZWNpZ19ldmVyX3llYXIsCiAgICAgICAgICAgICAgICBub25fZWNpZ19jdXJyZW50X3llYXIsCiAgICAgICAgICAgICAgICBjb250YWlucygibG93IiksCiAgICAgICAgICAgICAgICBjb250YWlucygidXBwIikpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIkNhdGVnb3J5IiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHMiKSAlPiUKICAgICMgZ2F0aGVyKGtleT1DYXRlZ29yeSwKICAgICMgICAgICAgIHZhbHVlPWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwKICAgICMgICAgICAgIC15ZWFyKSAlPiUKICAgIG11dGF0ZShFc3RpbWF0ZSA9IGNhc2Vfd2hlbihncmVwbCgiX2xvdyIsIENhdGVnb3J5KSB+ICJMb3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl91cHAiLCBDYXRlZ29yeSkgfiAiVXBwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTWVhbiIpLAogICAgICAgICBVc2VyID0gY2FzZV93aGVuKGdyZXBsKCJldmVyIiwgQ2F0ZWdvcnkpIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJjdXJyZW50IiwgQ2F0ZWdvcnkpIH4gIkN1cnJlbnQiKSwKICAgICAgICAgUHJvZHVjdCA9IGNhc2Vfd2hlbihncmVwbCgibm9uX2VjaWciLCBDYXRlZ29yeSkgfiAiT3RoZXIgcHJvZHVjdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiRS1jaWdhcmV0dGVzIikpICU+JQogIGRwbHlyOjpzZWxlY3QoLUNhdGVnb3J5KSAlPiUKICBzcHJlYWQoRXN0aW1hdGUsIGBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PU1lYW4sIGNvbG9yPVByb2R1Y3QpKSArCiAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1Vc2VyKSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygyLDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgYnkgPSAxMCksIGxpbWl0cyA9IGMoMCw2MCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiJSBVc2luZyBlLWNpZ2FyZXR0ZXMgaW5jcmVhc2VzICZcbiUgdXNpbmcgT3RoZXIgcHJvZHVjdHMgZGVjcmVhc2VzIiwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCnRpdGxlX3cgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKAogICAgZXhwcmVzc2lvbigiSGF2ZSB2YXBpbmcgcmF0ZXMgcG9zc2libHkgaW5mbHVlbmNlZCB0b2JhY2NvL25pY290aW5lIHVzZT8iKSwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLAogICAgaGp1c3QgPSAwCiAgKSArCiAgdGhlbWUoCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQogICkKCnBsb3RzQV93IDwtIHBsb3RfZ3JpZChwbG90QV93LAogICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygxKSwKICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAidiIsCiAgICAgICAgICAgICAgICAgICAgIGF4aXMgPSAiYnQiKQpwbG90c0JDX3cgPC0gcGxvdF9ncmlkKHBsb3RCX3csCiAgICAgICAgICAgICAgICAgICAgIHBsb3RDX3csCiAgICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsMSksCiAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gInYiLAogICAgICAgICAgICAgICAgICAgICBheGlzID0gImJ0IikKCmxlZ2VuZF93IDwtIGdldF9sZWdlbmQocGxvdEJfdyArCiAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikpCgpmaWd1cmVfdyA8LSBwbG90X2dyaWQodGl0bGVfdywKICAgICAgICAgICAgICAgICAgICAgIHBsb3RzQV93LAogICAgICAgICAgICAgICAgICAgICAgcGxvdHNCQ193LAogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kX3csCiAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IDEuMCkKCmZpZ3VyZV93CmBgYAoKIyMjIEh5cG90aGV0aGljYWwgQ29ob3J0CgpgYGB7cn0KcGxvdEFfd184IDwtIG55dHNfZGF0YSAlPiUKICBmaWx0ZXIoKEdyYWRlID09ICI4IiAmIHllYXIgPT0gMjAxNSkgfAogICAgICAgICAoR3JhZGUgPT0gIjkiICYgeWVhciA9PSAyMDE2KSB8CiAgICAgICAgIChHcmFkZSA9PSAiMTAiICYgeWVhciA9PSAyMDE3KSB8CiAgICAgICAgIChHcmFkZSA9PSAiMTEiICYgeWVhciA9PSAyMDE4KSB8CiAgICAgICAgICAoR3JhZGUgPT0gIjEyIiAmIHllYXIgPT0gMjAxOSkgCiAgICAgICAgICkgJT4lCiAgICBtdXRhdGUodG9iYWNjb19zdW1fZXZlciA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICB0b2JhY2NvX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJDIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpKSAlPiUKICAgIG11dGF0ZSh0b2JhY2NvX2V2ZXIgPSBjYXNlX3doZW4odG9iYWNjb19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2JhY2NvX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICB0b2JhY2NvX2N1cnJlbnQgPSBjYXNlX3doZW4odG9iYWNjb19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2JhY2NvX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSkgJT4lCiAgYXNfc3VydmV5X2Rlc2lnbihzdHJhdGEgPSBzdHJhdHVtLCBpZHMgPSBwc3UsIHdlaWdodCAgPSBmaW53Z3QpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvYmFjY29fZXZlcl95ZWFyID0gc3VydmV5X21lYW4odG9iYWNjb19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIHRvYmFjY29fY3VycmVudF95ZWFyID0gc3VydmV5X21lYW4odG9iYWNjb19jdXJyZW50LCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSkpICAlPiUKICBtdXRhdGVfYXQodmFycygteWVhciksICIqIiwgMTAwKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIlR5cGUiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpJT4lCiAgICAjIGdhdGhlcihrZXk9VHlwZSwKICAgICMgICAgICAgIHZhbHVlPWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwKICAgICMgICAgICAgIC15ZWFyKSAlPiUKICBtdXRhdGUoRXN0aW1hdGUgPSBjYXNlX3doZW4oZ3JlcGwoIl9sb3ciLCBUeXBlKSB+ICJMb3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl91cHAiLCBUeXBlKSB+ICJVcHBlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJNZWFuIiksCiAgICAgICAgIFVzZXIgPSBjYXNlX3doZW4oZ3JlcGwoImV2ZXIiLCBUeXBlKSB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiY3VycmVudCIsIFR5cGUpIH4gIkN1cnJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTWVhbiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1UeXBlKSAlPiUKICBzcHJlYWQoRXN0aW1hdGUsIGBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCkgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIseT1NZWFuKSkgKwogIGdlb21fbGluZShhZXMobGluZXR5cGU9VXNlcikpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIpKSArIAogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIsMSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCw3MCxieT0xMCksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDAsNzAsYnk9MTApLAogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCw3MCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiTmljb3RpbmUgcHJvZHVjdCB1c2VycyBiZWNvbWluZyBpbmNyZWFzaW5nbHkgcHJldmFsZW50IiwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCnBsb3RCX3dfOCA8LSBueXRzX2RhdGEgJT4lCiAgZmlsdGVyKChHcmFkZSA9PSAiOCIgJiB5ZWFyID09IDIwMTUpIHwKICAgICAgICAgKEdyYWRlID09ICI5IiAmIHllYXIgPT0gMjAxNikgfAogICAgICAgICAoR3JhZGUgPT0gIjEwIiAmIHllYXIgPT0gMjAxNykgfAogICAgICAgICAoR3JhZGUgPT0gIjExIiAmIHllYXIgPT0gMjAxOCkgfAogICAgICAgICAgKEdyYWRlID09ICIxMiIgJiB5ZWFyID09IDIwMTkpIAogICAgICAgICApICU+JQogICAgbXV0YXRlKGVjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgRUVMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBDRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fZXZlciA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJDIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBzZWxlY3QoLiwtQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSkpICU+JQogICAgbXV0YXRlKGVjaWdfZXZlciA9IGNhc2Vfd2hlbihlY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIGVjaWdfY3VycmVudCA9IGNhc2Vfd2hlbihlY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2V2ZXIgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpKSAlPiUKICBhc19zdXJ2ZXlfZGVzaWduKHN0cmF0YSA9IHN0cmF0dW0sIGlkcyA9IHBzdSwgd2VpZ2h0ICA9IGZpbndndCkgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShlY2lnX2V2ZXJfeWVhciA9IHN1cnZleV9tZWFuKGVjaWdfZXZlciwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBlY2lnX2N1cnJlbnRfeWVhciA9IHN1cnZleV9tZWFuKGVjaWdfY3VycmVudCwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBub25fZWNpZ19ldmVyX3llYXIgPSBzdXJ2ZXlfbWVhbihub25fZWNpZ19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhciA9IHN1cnZleV9tZWFuKG5vbl9lY2lnX2N1cnJlbnQsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXllYXIpLCAiKiIsIDEwMCkgJT4lCiAgZHBseXI6OnNlbGVjdCh5ZWFyLAogICAgICAgICAgICAgICAgZWNpZ19ldmVyX3llYXIsCiAgICAgICAgICAgICAgICBlY2lnX2N1cnJlbnRfeWVhciwKICAgICAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXJfeWVhciwKICAgICAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhciwKICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJsb3ciKSwKICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJ1cHAiKSkgJT4lCiAgIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIkNhdGVnb3J5IiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHMiKSU+JQogICAgIyBnYXRoZXIoa2V5PUNhdGVnb3J5LAogICAgIyAgICAgICAgdmFsdWU9YFBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHNgLAogICAgIyAgICAgICAgLXllYXIpICAlPiUKICBtdXRhdGUoRXN0aW1hdGUgPSBjYXNlX3doZW4oZ3JlcGwoIl9sb3ciLCBDYXRlZ29yeSkgfiAiTG93ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJfdXBwIiwgQ2F0ZWdvcnkpIH4gIlVwcGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk1lYW4iKSwKICAgICAgICAgVXNlciA9IGNhc2Vfd2hlbihncmVwbCgiY3VycmVudCIsIENhdGVnb3J5KSB+ICJDdXJyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkV2ZXIiLCksCiAgICAgICAgIFByb2R1Y3QgPSBjYXNlX3doZW4oZ3JlcGwoIm5vbl9lY2lnIiwgQ2F0ZWdvcnkpIH4gIk90aGVyIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkUtY2lnYXJldHRlcyIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1DYXRlZ29yeSkgJT4lCiAgc3ByZWFkKEVzdGltYXRlLCBgUGVyY2VudGFnZSBvZiBzdHVkZW50c2ApICU+JQogIGZpbHRlcihVc2VyPT0iRXZlciIpICU+JQogIGRwbHlyOjpyZW5hbWUoIkxvd2VyX3RlbXAiID0gVXBwZXIsCiAgICAgICAgICAgICAgICAiVXBwZXJfdGVtcCIgPSBMb3dlcikgJT4lCiAgZHBseXI6OnJlbmFtZSgiTG93ZXIiPUxvd2VyX3RlbXAsCiAgICAgICAgICAgICAgICAiVXBwZXIiPVVwcGVyX3RlbXApICU+JQogIGdncGxvdChhZXMoeD15ZWFyLHk9TWVhbiwgY29sb3I9UHJvZHVjdCkpICsKICBnZW9tX2xpbmUobGluZXR5cGU9MSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlcikpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxMCwgNjAsIGJ5ID0gMTApLCBsaW1pdHMgPSBjKDEwLDYwKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgbGFicyh0aXRsZSA9ICIlIGV2ZXIgdHJ5aW5nIG5pY290aW5lIHByb2R1Y3RzIGluY3JlYXNlcyIsCiAgICAgICAgIHkgPSAiJSBvZiBzdHVkZW50cyIpCgpwbG90Q193XzggPC0gbnl0c19kYXRhICU+JQogIGZpbHRlcigoR3JhZGUgPT0gIjgiICYgeWVhciA9PSAyMDE1KSB8CiAgICAgICAgIChHcmFkZSA9PSAiOSIgJiB5ZWFyID09IDIwMTYpIHwKICAgICAgICAgKEdyYWRlID09ICIxMCIgJiB5ZWFyID09IDIwMTcpIHwKICAgICAgICAgKEdyYWRlID09ICIxMSIgJiB5ZWFyID09IDIwMTgpIHwKICAgICAgICAgIChHcmFkZSA9PSAiMTIiICYgeWVhciA9PSAyMDE5KSAKICAgICAgICAgKSAlPiUKICAgIG11dGF0ZShlY2lnX3N1bV9ldmVyID0gc2VsZWN0KC4sIEVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPSBzZWxlY3QoLiwgQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIHNlbGVjdCguLC1FRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUNFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpKSAlPiUKICAgIG11dGF0ZShlY2lnX2V2ZXIgPSBjYXNlX3doZW4oZWNpZ19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBlY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4oZWNpZ19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19ldmVyID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19jdXJyZW50ID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSkgJT4lCiAgYXNfc3VydmV5X2Rlc2lnbihzdHJhdGEgPSBzdHJhdHVtLCBpZHMgPSBwc3UsIHdlaWdodCAgPSBmaW53Z3QpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKGVjaWdfZXZlcl95ZWFyID0gc3VydmV5X21lYW4oZWNpZ19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIGVjaWdfY3VycmVudF95ZWFyID0gc3VydmV5X21lYW4oZWNpZ19jdXJyZW50LCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXJfeWVhciA9IHN1cnZleV9tZWFuKG5vbl9lY2lnX2V2ZXIsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgbm9uX2VjaWdfY3VycmVudF95ZWFyID0gc3VydmV5X21lYW4obm9uX2VjaWdfY3VycmVudCwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpKSAlPiUKICBtdXRhdGVfYXQodmFycygteWVhciksICIqIiwgMTAwKSAlPiUKICBkcGx5cjo6c2VsZWN0KHllYXIsCiAgICAgICAgICAgICAgICBlY2lnX2V2ZXJfeWVhciwKICAgICAgICAgICAgICAgIGVjaWdfY3VycmVudF95ZWFyLAogICAgICAgICAgICAgICAgbm9uX2VjaWdfZXZlcl95ZWFyLAogICAgICAgICAgICAgICAgbm9uX2VjaWdfY3VycmVudF95ZWFyLAogICAgICAgICAgICAgICAgY29udGFpbnMoImxvdyIpLAogICAgICAgICAgICAgICAgY29udGFpbnMoInVwcCIpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC15ZWFyLCBuYW1lc190byA9ICJDYXRlZ29yeSIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIiklPiUKICAgICMgZ2F0aGVyKGtleT1DYXRlZ29yeSwKICAgICMgICAgICAgIHZhbHVlPWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwKICAgICMgICAgICAgIC15ZWFyKSAlPiUKICAgIG11dGF0ZShFc3RpbWF0ZSA9IGNhc2Vfd2hlbihncmVwbCgiX2xvdyIsIENhdGVnb3J5KSB+ICJMb3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl91cHAiLCBDYXRlZ29yeSkgfiAiVXBwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTWVhbiIpLAogICAgICAgICBVc2VyID0gY2FzZV93aGVuKGdyZXBsKCJldmVyIiwgQ2F0ZWdvcnkpIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJjdXJyZW50IiwgQ2F0ZWdvcnkpIH4gIkN1cnJlbnQiKSwKICAgICAgICAgUHJvZHVjdCA9IGNhc2Vfd2hlbihncmVwbCgibm9uX2VjaWciLCBDYXRlZ29yeSkgfiAiT3RoZXIgcHJvZHVjdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiRS1jaWdhcmV0dGVzIikpICU+JQogIGRwbHlyOjpzZWxlY3QoLUNhdGVnb3J5KSAlPiUKICBzcHJlYWQoRXN0aW1hdGUsIGBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PU1lYW4sIGNvbG9yPVByb2R1Y3QpKSArCiAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1Vc2VyKSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlcikpICsgCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoMiwxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNjAsIGJ5ID0gMTApLCBsaW1pdHMgPSBjKDAsNjApKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHRpdGxlID0gIkUtY2lnYXJldHRlIHVzZSBzdXJwYXNzZXMgdXNlIG9mIG90aGVyIG5pY290aW5lIHByb2R1Y3RzIiwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCnRpdGxlX3dfOCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKCJBbW9uZyJ+OF50aH4iZ3JhZGVycyBpbiAyMDE1LCBoYXZlIHZhcGluZyByYXRlcyBwb3NzaWJseSBpbmZsdWVuY2VkIHRvYmFjY28vbmljb3RpbmUgdXNlPyIpLAogICAgZm9udGZhY2UgPSAnYm9sZCcsCiAgICBzaXplPTE0LAogICAgeCA9IDAsCiAgICBoanVzdCA9IDAKICApICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKcGxvdHNBX3dfOCA8LSBwbG90X2dyaWQocGxvdEFfd184LAogICAgICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygxKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAidiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMgPSAiYnQiKQoKcGxvdHNCQ193XzggPC0gcGxvdF9ncmlkKHBsb3RCX3dfOCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RDX3dfOCwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsMSksCiAgICAgICAgICAgICAgICAgICAgICAgICBheGlzID0gImJ0IikKCmxlZ2VuZF93XzggPC0gZ2V0X2xlZ2VuZChwbG90Ql93XzggKwogICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpKQoKZmlndXJlX3dfOCA8LSBwbG90X2dyaWQodGl0bGVfd184LAogICAgICAgICAgICAgICAgICAgICAgICBwbG90c0Ffd184LAogICAgICAgICAgICAgICAgICAgICAgICBwbG90c0JDX3dfOCwKICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kX3dfOCwKICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gMS4wCikKCmZpZ3VyZV93XzgKYGBgCgojIyMgRmluYWwgRmlndXJlCgpgYGB7cn0KdGl0bGVfZmluYWwgPC0gZ2dkcmF3KCkgKwogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKCJIYXZlIHZhcGluZyByYXRlcyBwb3NzaWJseSBpbmZsdWVuY2VkIHRvYmFjY28vbmljb3RpbmUgdXNlPyIpLAogICAgZm9udGZhY2UgPSAnYm9sZCcsCiAgICBzaXplPTE2LAogICAgeCA9IDAuNSkgKwogIHRoZW1lKAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMCkKICApCgpzdWJ0aXRsZV91d19maW5hbCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKH42XnRofiItIn4xMl50aH4iZ3JhZGVycywgdW53ZWlnaHRlZCIpLAogICAgc2l6ZT0xMiwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKc3VidGl0bGVfd19maW5hbCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKH42XnRofiItIn4xMl50aH4iZ3JhZGVycywgd2VpZ2h0ZWQiKSwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xMiwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKc3VidGl0bGVfd184X2ZpbmFsIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgKICAgIGV4cHJlc3Npb24ofjhedGh+ImdyYWRlcnMgaW4gMjAxNSwgd2VpZ2h0ZWQiKSwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xMiwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKc3VidGl0bGVfZmluYWwgPC0gcGxvdF9ncmlkKHN1YnRpdGxlX3V3X2ZpbmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGVfd19maW5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlX3dfOF9maW5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQoKcGxvdHNBX3RpdGxlX2ZpbmFsIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgKICAgIGV4cHJlc3Npb24oIlByZXZhbGVuY2Ugb2YgZS1jaWdhcmV0dGUgdXNlIGJ5IHVzZXIgdHlwZSIpLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKcGxvdHNBX2ZpbmFsIDwtIHBsb3RfZ3JpZChwbG90QV91dyArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RBX3cgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90QV93XzggKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICJ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzID0gImJ0IikKCnBsb3RzQl90aXRsZV9maW5hbCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKCJQcmV2YWxlbmNlIG9mIGV2ZXIgdXNlIGJ5IHByb2R1Y3QgdHlwZSIpLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKcGxvdHNCX2ZpbmFsIDwtIHBsb3RfZ3JpZChwbG90Ql91dyArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RCX3cgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90Ql93XzggKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICJ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzID0gImJ0IikKCnBsb3RzQ190aXRsZV9maW5hbCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKCJQcmV2YWxlbmNlIG9mIG5pY290aW5lIHByb2R1Y3QgdXNlIGJ5IHByb2R1Y3QgJiB1c2VyIHR5cGUiKSwKICAgIHNpemU9MTQsCiAgICB4ID0gMC41KSArCiAgdGhlbWUoCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQogICkKCnBsb3RzQ19maW5hbCA8LSBwbG90X2dyaWQocGxvdENfdXcgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90Q193ICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdENfd184ICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAidiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcyA9ICJidCIpCgpsZWdlbmRfZmluYWwgPC0gZ2V0X2xlZ2VuZChwbG90Ql93ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSkKCmZpbmFsX3Bsb3QgPC0gcGxvdF9ncmlkKHRpdGxlX2ZpbmFsLAogICAgICAgICAgcGxvdHNBX3RpdGxlX2ZpbmFsLAogICAgICAgICAgc3VidGl0bGVfZmluYWwsCiAgICAgICAgICBwbG90c0FfZmluYWwsCiAgICAgICAgICBwbG90c0JfdGl0bGVfZmluYWwsCiAgICAgICAgICBzdWJ0aXRsZV9maW5hbCwKICAgICAgICAgIHBsb3RzQl9maW5hbCwKICAgICAgICAgIHBsb3RzQ190aXRsZV9maW5hbCwKICAgICAgICAgIHN1YnRpdGxlX2ZpbmFsLAogICAgICAgICAgcGxvdHNDX2ZpbmFsLAogICAgICAgICAgbGVnZW5kX2ZpbmFsLAogICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSkpCgpmaW5hbF9wbG90CmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZSgiZmluYWxfcGxvdC5wbmciKQpgYGAKCiMgSG9tZXdvcmsgcXVlc3Rpb25zCgo8c3R5bGU+CmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojZTZmMGZmOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQo8L3N0eWxlPgo8ZGl2IGNsYXNzID0gImJsdWUiPgoKKyBBcHBseSBzdXJ2ZXkgd2VpZ2h0cyB0byBvbmUgb2YgdGhlIGZpZ3VyZXMgcHJvZHVjZWQgaW4gdGhpcyBjYXNlIHN0dWR5IGluIHdoaWNoIHdlaWdodGVkIGVzdGltYXRlcyB3ZXJlIG5vdCBwcm9kdWNlZC4gSW5jbHVkZSBlcnJvciBiYXJzIGluIHRoZSB1cGRhdGVkIGZpZ3VyZS4KICAgICsgRG9lcyB0aGUgZmlndXJlIGNoYW5nZSBhZnRlciB0aGUgYXBwbGljYXRpb24gb2Ygc3VydmV5IHdlaWdodHM/CiAgICArIElmIHNvLCBkZXNjcmliZSBob3cuIAorIFJlcHJvZHVjZSBgZmluYWxfcGxvdGAgYWJvdmUgZm9yIGEgZGlmZmVyZW50IGNvaG9ydCBvZiB5b3VyIGNob2ljZS4KCjwvZGl2PgoKIyBOb3RlcwoKRXZlciBhbmQgY3VycmVudCB2YXJpYWJsZXMgYXJlIGxpbWl0ZWQgdG8gdGhvc2Ugc2hhcmVkIGJ5IGFsbCB5ZWFycyBvZiBkYXRhIGluY2x1ZGVkIGluIHRoaXMgY2FzZSBzdHVkeS4KCmBgYHtyLCBlY2hvPUZBTFNFfQprbml0X3RpbWVfZW5kIDwtIFN5cy50aW1lKCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0Ka25pdF90aW1lIDwtIGtuaXRfdGltZV9lbmQgLSBrbml0X3RpbWVfc3RhcnQKa25pdF90aW1lX21lc3NhZ2UgPC0gcGFzdGUoIktuaXQgdGltZToiLAogICAgICByb3VuZChhcy5udW1lcmljKGtuaXRfdGltZSkgLDMpLAogICAgICB1bml0cyhrbml0X3RpbWUpCiAgICAgICkKYGBgCgo8cCBzdHlsZT0iY29sb3I6cmVkIj5OZXcgY29kZTogYHIga25pdF90aW1lX21lc3NhZ2VgLiBQcmV2aW91cyBjb2RlOiB+IDMgbS4gPC9wPgoKIyBQcm9ibGVtcwoKSSBoYWQgZGlmZmljdWx0eSBwcm9kdWNpbmcgYSBwbG90IHRoYXQgc3VjY2luY3RseSBwcmVzZW50ZWQgYSB0cmVuZC4gSXQncyB2ZXJ5IGVhc3kgdG8gcHJvZHVjZSBwbG90cyB0aGF0IGFyZSB2ZXJ5IHVzZWZ1bCBvbmNlIG9uZSBpcyBmYW1pbGlhciB3aXRoIHRoZSBkYXRhLiBTb21lIHBsb3RzLCBob3dldmVyLCBjYW5ub3Qgc3RhbmQgYWxvbmUgYW5kIG5lZWQgYWRkaXRpb25hbCBjb250ZXh0IHRvIGJlIGNsZWFyIGZvciB0aG9zZSB3aXRob3V0IHByaW9yIGtub3dsZWRnZSBvZiB0aGUgZGF0YS4gV2hlbiBJIGZpcnN0IHNoYXJlZCBhIHBsb3QgSSBoYWQgYmVlbiB3b3JraW5nIG9uIHdpdGggb3RoZXJzLCBpdCBiZWNhbWUgY2xlYXIgdGhhdCBpbiBteSBlZmZvcnQgdG8gcHJlc2VudCBhIGNvbXBsaWNhdGVkIGlkZWEgYnJpZWZseSBJIGhhZCBsZWZ0IG91dCBpbmZvcm1hdGlvbiB0aGF0IHdvdWxkIG1ha2UgdGhlIHRyZW5kIGVhc2lseSBpbnRlcnByZXRhYmxlLiBUbyBzb2x2ZSB0aGlzIGlzc3VlLCBJIGJlZ2FuIHRvIHByZXNlbnQgdmlzdWFsaXphdGlvbnMgb2YgdGhlIGRhdGEgYWxvbmdzaWRlIG15IG9yaWdpbmFsIHBsb3QuIFRoZSBmaW5hbCBmaWd1cmUgSSBjcmVhdGVkIGNvbnRhaW5lZCBzZXZlcmFsIGFkZGl0aW9uYWwgcGxvdHMsIGVhY2ggcHJlc2VudGluZyB0aGUgc2FtZSB0cmVuZCBhdCBhIGRpZmZlcmVudCBsZXZlbCB0aGFuIG15IGluaXRpYWwgcGxvdC4KCk15ICJjZW50ZXJwaWVjZSIgcGxvdCBpcyB0aGUgbWlkZGxlIHBsb3QgaW4gYGZpbmFsX3Bsb3RgLiBUaGUgOCBwbG90cyBhcm91bmQgaXQgaGVscCBwcm92aWRlIGEgdmVyeSBjbGVhciBwaWN0dXJlIG9mIHdoYXQgaXMgZ29pbmcgb24gaW4gdGhlIFVTIHdpdGggcmVnYXJkcyB0byBlLWNpZ2FyZXR0ZSB1c2UgYW5kIG5pY290aW5lIHByb2R1Y3QgdXNlIGF0IGxhcmdlLiBPbiBpdHMgb3duLCBpdCdzIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kIHRoZSB0cmVuZHMgaW4gdGhlIFVTIGFuZCBob3cgaW1wb3J0YW50IHRoZSB3ZWlnaHRpbmcgc2NoZW1lIGlzIGZvciBpbmZlcmVuY2UuIE9uY2UgeW91IGFkZCB0aGUgbGVmdCBhbmQgcmlnaHQgY29sdW1ucywgaXQncyBjbGVhciB3aGF0IGlzIGdvaW5nIG9uLiA=